SpringBoot中的统一异常处理

在互联网时代,不管是面向广大用户的应用、WEB,还是公司内部管理系统,如果有了异常,而没有正确的去处理,那么出现的500服务器错误,那是非常不友好的,不友好的出现异常错误,都会可能导致用户的流失,程序中的bug导致的服务器错误是不可避免的,那么我们就要统一捕获这些异常来给用户展现友好的界面来提高用户体验,今天就来介绍一下SpringBoot的异常处理方式!

SpringBoot中的统一异常处理

启动一个简单的SpringBoot应用,正常访问一下:

SpringBoot中的统一异常处理

SpringBoot中的统一异常处理

如果在这个方法中插入一段异常代码,会发生什么事情呢?

SpringBoot中的统一异常处理

 

SpringBoot中的统一异常处理

 

出现上面的异常错误页面,对于用户来说是很不友好的,对于你的领导来说,你是致命的,那么我们就要统一的捕获这些异常,来给用户展示比较友好的界面,不要因为咱们的失误来导致用户流失。

对于异常处理,我们可以在对应的方法中捕获异常,然后进行异常处理,但是这样每一个方法都这样捕获异常进行处理,从代码整洁度来看是不可取的,对于这种处理方式也会让工作显得繁重。而SpringBoot开发利器就提供了这样的注解,来统一处理异常,这个注解就是@ExceptionHandler,我这里就不用漂亮的页面作为异常捕获展示,就用字符串作为展示捕获异常处理页面。

在需要捕获异常的Controller中加入如下代码,那么访问异常的URL就会出现友好的提示:

SpringBoot中的统一异常处理

SpringBoot中的统一异常处理

注解@ExceptionHandler用来注解处理异常的方法,value属性表示处理的异常类型,如果在一个Controller中有一个用@ExceptionHandler修饰的方法,当Controller的任何一个方法抛出异常时,都会由@ExceptionHandler注解修饰的方法处理异常,而不会抛给servlet容器。

注意,上面说的时在一个Controller中,那么在另外的一个Controller中有了异常,会捕获吗?

SpringBoot中的统一异常处理

 

SpringBoot中的统一异常处理

可以看出,通过@ExceptionHandler注解修饰的方法处理异常,只在当前Controller中生效,广大的码友同志们都会脑洞大开,会给出一个方案,那就是写一个父类,在父类中写捕获异常的方法,然后子类继承父类,那么所有的子类都会有处理异常的能力了,这样不失为一个好办法,但如果忘了继承父类,那么也会出现不友好的异常页面,不用着急,不用气馁,SpringBoot也为我们提供这样机制,来统一处理异常。

SpringBoot中的统一异常处理

 

那就是配合使用注解@ControllerAdvice,@ControllerAdvice注解的类就是当前项目中所有类的统一异常处理类,@ExceptionHandler注解的方法用来定义函数针对异常类型以及异常如何处理,不用在每个Controller中逐一定义异常处理方法了。代码示例如下:

SpringBoot中的统一异常处理

 

这样不用在其他Controller中定义了,访问如下:

SpringBoot中的统一异常处理

SpringBoot中的统一异常处理

这样做异常处理,再也不用担心出来不友好的异常信息了!