html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,issue,performed_via_github_app https://github.com/simonw/datasette/issues/1770#issuecomment-1185944799,https://api.github.com/repos/simonw/datasette/issues/1770,1185944799,IC_kwDOBm6k_c5GsBTf,9599,2022-07-15T21:09:08Z,2022-07-15T21:09:08Z,OWNER,Had to lookup that `Base400` thing: https://github.com/simonw/datasette/blob/950cc7677f65aa2543067b3bbfc2b6acb98b62c8/datasette/utils/asgi.py#L16-L29,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185943887,https://api.github.com/repos/simonw/datasette/issues/1770,1185943887,IC_kwDOBm6k_c5GsBFP,9599,2022-07-15T21:07:53Z,2022-07-15T21:07:53Z,OWNER,In `DatasetteRouter` I'm going to rename `handle_500` to `handle_exception` because it already deals with error codes other than 500 (`Forbidden` exceptions become 403 and `Base400` become 400).,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185939664,https://api.github.com/repos/simonw/datasette/issues/1770,1185939664,IC_kwDOBm6k_c5GsADQ,9599,2022-07-15T21:04:19Z,2022-07-15T21:04:19Z,OWNER,I'll implement this hook and then release it as `0.62a1`.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185935764,https://api.github.com/repos/simonw/datasette/issues/1770,1185935764,IC_kwDOBm6k_c5Gr_GU,9599,2022-07-15T21:02:00Z,2022-07-15T21:02:12Z,OWNER,Returning a `Response` is by far the most intuitive way to design this though. Plugin authors shouldn't care that `DatasetteRouter` (an undocumented internal API of Datasette) doesn't currently handle responses.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185933972,https://api.github.com/repos/simonw/datasette/issues/1770,1185933972,IC_kwDOBm6k_c5Gr-qU,9599,2022-07-15T21:00:56Z,2022-07-15T21:00:56Z,OWNER,It's weird to return a `Response` though because the code in question lives in `DatasetteRouter` which currently works outside of the layer where responses happen - everything in that class at the moment works using `send` directly.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185931417,https://api.github.com/repos/simonw/datasette/issues/1770,1185931417,IC_kwDOBm6k_c5Gr-CZ,9599,2022-07-15T20:59:25Z,2022-07-15T20:59:25Z,OWNER,"... maybe it should take `send`? But then how would plugins know that another plugin hadn't already used `send` to send a response, and avoid two trying to send at the same time?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185929360,https://api.github.com/repos/simonw/datasette/issues/1770,1185929360,IC_kwDOBm6k_c5Gr9iQ,9599,2022-07-15T20:58:11Z,2022-07-15T20:58:11Z,OWNER,"Proposed hook design: ```python @hookspec def handle_exception(datasette, request, exception): """"""Handle an uncaught exception"""""" ``` It takes `request` in case it needs to render a template and pass the request to it.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437, https://github.com/simonw/datasette/issues/1770#issuecomment-1185925081,https://api.github.com/repos/simonw/datasette/issues/1770,1185925081,IC_kwDOBm6k_c5Gr8fZ,9599,2022-07-15T20:55:41Z,2022-07-15T20:56:16Z,OWNER,"I think the hook gets called any time any exception makes it to this function: https://github.com/simonw/datasette/blob/950cc7677f65aa2543067b3bbfc2b6acb98b62c8/datasette/app.py#L1374-L1440 Multiple plugins can register for the hook. If they return a `Response` then that's returned to the user - if they return `None` then they can quietly do something with the error (log it to Sentry for example) and let some other handler return a response. I think Datasette should have a default plugin hook implementation which returns the 500 error page.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",1306492437,