异常处理
我们在构建一个系统的时候,除了技术栈的选择之外,其实异常处理有时候对于我们也是异常的重要,因为我们可以减少工作量,同时可以方便快速排查错误.
首先我们可以将异常分为:自定义异常跟非自定义异常。自定义异常,我们其实就是根据自己系统的业务异常,而非自定义异常就是spring的异常。
针对自定义异常,我们是新建自定义异常类,继承runtimeException,不是继承Exception的原因是减少代码注入,然后再自定义异常类的带参构造中构造跟前端定义好的错误类。
然后就是如何捕获异常了,针对springboot,我们可以使用控制器增强器@ControllerAdvice(该注解打在类上),然后定义一个方法,在方法上需要打上@ExceptionHandler(自定义异常类.class) ,那么在将来该异常被抛出的时候就会执行该方法,我们可以针对性的返回对应的出参.
针对spring的异常,我们可以定义方法,打上@ExceptionHandler(Exception.class),然后再该方法内判断对应的异常,返回对应的出参,至于如何判断对应的异常,我们可以提前将一些spring的异常放入到一个Map中,这里我们可以使用谷歌的guava的ImmutableMap,为什么使用?
指的是:不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。
为什么要用immutable对象?immutable对象有以下的优点:
1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
2.线程安全的:immutable对象在多线程下安全,没有竞态条件
3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)
4.可以被使用为一个常量,并且期望在未来也是保持不变的
然后我们从map中取到对应的异常,然后抛出对应的出参.
<!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>