参考答案

Koa 中间件的异常处理是通过 try...catch 语句和错误处理中间件实现的。当某个中间件函数抛出了异常时,Koa 会自动将控制权交给下一个错误处理中间件,如果没有错误处理中间件,则返回默认的 500 错误响应。

下面是一个简单的 Koa 错误处理中间件示例代码:

const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { try { await next(); } catch (err) { ctx.status = err.status || 500; ctx.body = { message: err.message, error: err.stack }; } }); app.use(async (ctx, next) => { if (Math.random() < 0.5) { throw new Error('Oops! Something went wrong.'); } else { ctx.body = { message: 'Hello, world!' }; } }); app.listen(3000); console.log('Server running on http://localhost:3000');

在上述代码中,通过 try...catch 捕获了第二个中间件函数中可能抛出的异常,并使用第一个中间件作为错误处理中间件进行处理。当出现异常时,第一个中间件会将错误状态码和错误信息添加到上下文对象的响应头中,并返回一个错误对象。如果没有出现异常,则执行下一个中间件函数并返回正常的响应结果。

在编写 Koa 中间件时,需要遵循良好的异常处理方式,不要在中间件函数中直接抛出异常,而应该将异常对象包装成 Error 对象并返回。并且,在继承洋葱模型时,需要注意错误处理中间件的顺序和位置,以保证程序的稳定运行。