异常处理
bwcx 完全不介入任何异常的处理,不提供默认行为,用户需要自己处理异常并定制返回。
自定义异常
需要继承 Exception
类。
import { Exception } from 'bwcx-ljsm';
export default class CustomRequestException extends Exception {
public code: number;
constructor(code: number) {
super(`Request error with code ${code}`);
this.name = 'CustomRequestException';
this.code = code;
}
}
// 抛出自定义异常
throw new CustomRequestException(-1);
TIP
框架也提供了诸如 ValidationException
等内置异常。
定义异常处理器
对于每种框架内置异常和自定义异常,都需要自行定义异常处理器,决定如何记录错误信息和返回。
需要使用 @ExceptionHandler()
装饰器标注并指定需要处理的异常类,同时实现 IBwcxExceptionHandler
接口。
import { ExceptionHandler, IBwcxExceptionHandler, RequestContext } from 'bwcx-ljsm';
import CustomRequestException from '../exceptions/custom-request.exception';
@ExceptionHandler(CustomRequestException)
export default class CustomRequestExceptionHandler implements IBwcxExceptionHandler {
catch(error: CustomRequestException, ctx: RequestContext) {
console.error(error);
ctx.status = 500;
ctx.body = {
msg: 'Internal Server Error',
code: error.code,
};
}
}
TIP
@ExceptionHandler()
默认作用域是 Singleton
。
TIP
对于未设置异常处理器的异常,框架会向上查找其父类,直到有一种异常可以被处理为止。如果没有任何异常处理器可以处理此异常,则最终会由 web 框架处理。
因此,我们建议总是设置一个用来处理最顶层异常(Error
)的异常处理器,以保证非预期的异常可以被处理。