要习惯使用 throw ,它使得你的代码目的明确,throw 会明确地将程序引到错误处理中间件,这对同步或异步的程序都是适用的。
遇到特殊情况,当你觉得有必要时,也可以自行 try/catch。
app.get('https://www.jb51.net/', wrap(async (req, res) => { if (!req.params.id) { throw new BadRequestError('Missing Id') } let companyLogo try { companyLogo = await getBase64Logo(req.params.id) } catch (err) { console.error(err) companyLogo = genericBase64Logo } }))
要习惯使用 custom error classes ,如 BadRequestError,因为这可以让你在错误处理中间件中更方便地分类处理。
app.use(function (err, req, res, next) { if (err instanceof BadRequestError) { res.status(400) return res.send(err.message) } ... })
需要注意
以上介绍的方法要求所有异步操作必须返回 promise。如果你的异步操作是使用回调函数的方式,你需要将其转化成 promise。(可以直接使用 Bluebird.promisifyAll 这类函数)
事件发射器(如 steams)仍然会导致未捕获异常,你需要注意合理地处理这类情况:
您可能感兴趣的文章: