AI通识课
如何对HonoJS运行期错误进行处理?
可以通过调用Hono的notFound与onError方法注册全局性的错误处理器。
不过,大部分情况下不需要添加,只有自己确实想定制处理的时候才需要。
假如处理不好,返回给客户端的信息可能会有混淆,所以,不建议覆写,尤其是onError(如果非要覆写,需要处理不同error类型的检查和分类)。
比如,今天(2024-01-19)就因为自定义了onError全都返回500, 导致我以为是hono框架的问题,实际上是我没有区分具体的Error类型,全都一股脑儿的返回500,从而形成错觉。 (即使hono原始返回的Error是401的错误,我也是返回了500,从而觉得是hono的问题,其实是我的问题)
// Custom Not Found Messageapp.notFound((c) => { return c.text('404 Not Found', 404)})
// Error handling// app.onError((err, c) => {// // way:1 to handle:// throw err// // way:2 to handle:// console.trace()// console.error(err.toString())// return c.text('Auth Internal Server Error', 500)// })
另外,在编写handler逻辑的时候,如果中间有状态我们想要交给全局的错误处理器,可以通过抛出HTTPException的方式达成这一目的:
import { HTTPException } from 'hono/http-exception'
c.get("/xyz", (c)=> { ... if(someConditionWeDontWantToContinue()) { throw new HTTPException(403, { message: 'you are not allowed to come into here.' }) } ...})
HTTPException的设计初衷更多是面向出现致命 1错误的场景(比如认证失败、没有权限等情况),在Handler较少用到,因为Handler中有更多选择来处理分支逻辑,所以,HTTPException反倒是在Hono的Middleware实现中更能发挥作用,因为Middleware不能返回Response(handler则可以),所以,除了让处理流程顺着Pipeline设计“顺流直下”,唯一可以干预的方式就是通过抛出HTTPException来中断执行流程。
Footnotes
-
其实也没有那么致命,只不过英文原文是Fatal Error。 ↩
「架构师的修炼」大礼包
管理者入门与进阶课程