在请求的整个处理链路中,当发生错误,没法继续走下去,一种方式是在业务代码中自己捕获直接处理,另一种方式是直接抛出异常,交由异常拦截器来处理,这是推荐的方式,因为这样很好的将异常处理逻辑从业务代码抽离,业务代码更易维护。Malagu 框架提供了一个默认异常处理器,默认实现比较简单,大家也可以实现自己的异常处理器,处理某些特殊的异常。
定义
export interface ErrorHandler {
readonly priority: number;
canHandle(ctx: Context, err: Error): Promise<boolean>;
handle(ctx: Context, err: Error): Promise<void>;
}
实现
@Component(ErrorHandler)
export class HttpErrorHandler implements ErrorHandler {
readonly priority: number = HTTP_ERROR_HANDlER_PRIORITY;
canHandle(ctx: Context, err: Error): Promise<boolean> {
return Promise.resolve(err instanceof HttpError);
}
async handle(ctx: Context, err: HttpError): Promise<void> {
ctx.response.statusCode = err.statusCode;
ctx.response.end(err.message);
}
}