在请求的整个处理链路中,当发生错误,没法继续走下去,一种方式是在业务代码中自己捕获直接处理,另一种方式是直接抛出异常,交由异常拦截器来处理,这是推荐的方式,因为这样很好的将异常处理逻辑从业务代码抽离,业务代码更易维护。Malagu 框架提供了一个默认异常处理器,默认实现比较简单,大家也可以实现自己的异常处理器,处理某些特殊的异常。

定义

  1. export interface ErrorHandler {
  2. readonly priority: number;
  3. canHandle(ctx: Context, err: Error): Promise<boolean>;
  4. handle(ctx: Context, err: Error): Promise<void>;
  5. }

实现

  1. @Component(ErrorHandler)
  2. export class HttpErrorHandler implements ErrorHandler {
  3. readonly priority: number = HTTP_ERROR_HANDlER_PRIORITY;
  4. canHandle(ctx: Context, err: Error): Promise<boolean> {
  5. return Promise.resolve(err instanceof HttpError);
  6. }
  7. async handle(ctx: Context, err: HttpError): Promise<void> {
  8. ctx.response.statusCode = err.statusCode;
  9. ctx.response.end(err.message);
  10. }
  11. }