说起nestjs的异常过滤器,不能不提.net的全局过滤器filter,功能那是相当的强悍,用理论话说叫aop 面向切面编程,可谓方便了太多需要异常处理的场景。说回nestjs的异常过滤器,实现类似的功能,采用相似的处理方式,只不过一个面向c#,一个面向nodejs,很荣幸的我,在两个框架都找到了类似的东西。

面向切面编程aop,是一种类似于编程规范的东东,同门师兄弟有叫面向接口编程、solid原则等等。

nestjs的异常处理

默认异常处理

nestjs内置了默认的全局异常过滤器,处理能够转换成httpexception的异常。

如果是httpexception或其子类异常,那么会返回该异常的json格式:

如果不是httpexception或其子类异常,那么会返回:

由于nestjs采用了内置的默认异常处理,因此不会出现由于出现未捕获的异常导致程序崩溃。

自定义异常过滤器处理

由于内置异常处理返回值格式无法调整,因此自定义异常就显得又为正常。自定义异常可以使返回异常信息自定义,且可以增加自定义异常编码,方便客户端人员根据异常编码进行不同的展示。

如何自定义异常?

不重复造轮子是程序员的自我约束,首先我们新建我们自己的异常基类:

然后我们新建一个未授权异常类型,其中增加了自定义异常代码:

建立好了自定义异常,那么我们就需要处理未授权异常,首先新建自定义异常处理基类,请注意 此处我们使用的事express:

新建未授权异常处理:

针对未授权异常处理类,进行几点说明:

  1. 增加了catch注解,只捕获authexception的异常,其他类型的异常此类不进行处理
  2. 继承自定义异常处理类baseexceptionfilter

应用范围

异常处理类可应用于method、controller、全局,甚至同一个controller可以定义多个自定义异常类

几点说明:

  1. 我们使用usefilters注解进行异常过滤器的添加
  2. 我们在appcontroller中定义了两种不同类型的自定义异常处理类
  3. 也就是我们appcontroller中抛出的异常,只要是我们定义的这两种,那么都可以被正常处理。

几点疑问

usefitlers中我们自定义的异常处理类会初始化几次?
答案:我们通过类型注册到appcontroller的自定义异常类只会在程序初始化的时候初始化一次。也就是说程序启动之后,每个

controller、每个method定义了哪些异常处理类都已经确定。
如果我们捕获到异常,但不进行任何处理,会发生什么?
答案:如果我们的异常处理方法什么也不做,那么恭喜你,会成功的将浏览器请求hang死,因为异常未处理,那么浏览器会一直得不到响应。

多个异常之间的处理顺序如何?
答案:如果多个异常处理均可以捕获到该异常,那么只有第一个有效,也就是说异常处理类和 中间件不同,异常处理类只能其中一个处理,而中间件需要都进行处理。

nestjs的@usefilters 像谁?
首先从js角度来看,像angular,如果往后端看,最像spring。 

nestjs的异常处理并不复杂,复杂的是需要我们针对不同类型的异常进行处理,提取异常的共性。

参考文档:docs.nestjs.cn

到此这篇关于nestjs中异常过滤器exceptionfilter的具体使用的文章就介绍到这了,更多相关nest 异常过滤器exceptionfilter内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!