springboot统一异常处理捕获,springboot全局捕获异常

  springboot统一异常处理捕获,springboot全局捕获异常

  

目录

一、背景二、需求三、编写一些异常基础代码四、注意事项五、总结六、代码实现七、参考文档

 

  

一、背景

在我们编写程序的过程中,程序中可能随时发生各种异常,那么我们如何优雅的处理各种异常呢?

 

  

二、需求

1、拦截系统中部分异常,返回自定义的响应。

 

  比如:

  系统发生http requestmethodnotsupportedexception异常,我们需要返回如下信息。

  超文本传送协议(超文本传输协议的缩写)的状态码:返回405

  {代码:自定义异常码,消息:错误消息}2、实现自定义异常的拦截

  拦截我们自己写的商业异常

  

三、编写一些异常基础代码

1、引入冲突包

 

  依赖性依赖性groupIdorg.springframework.boot/groupId artifact id spring-boot-starter-web/artifact id/依赖性依赖性groupIdorg.springframework.boot/groupId工艺品弹簧靴起动器验证/artifactId/依赖性/依赖性注意:

  引入弹簧启动启动器验证是为了验证请求的中的参数,然后当参数不满足时抛出异常。

  2、定义一个自定义异常

  公共类商业异常扩展运行时异常{公共业务异常(){ }公共业务异常(字符串消息){超级(消息);}公共BizException(字符串消息,可投掷原因){超级(消息,原因);} public biz exception(Throwable原因){ super(原因);} public biz exception(String message,Throwable cause,boolean enableSuppression,boolean writableStackTrace){ super(message,cause,enableSuppression,writableStackTrace);}}解释

  提供一个/异常/密码api,需要传递一个密码参数

  1、当不传递密码参数时将抛出MethodArgumentNotValidException异常。

  2、当密码传递例外参数时,则抛出商业异常异常。

  4、测试

  1、不传递密码参数响应是什么

  1、使用默认的DefaultHandlerExceptionResolver处理

  这个类DefaultHandlerExceptionResolver是默认自动配置的。

  从上图中可以看出有一个默认字段的返回值

  2、使用ResponseEntityExceptionHandler处理

  1、编写异常处理代码-使用默认的逻辑

  @RestControllerAdvicepublic类RestExceptionHandler扩展了ResponseEntityExceptionHandler { @ Override protected ResponseEntityObject handleMethodArgumentNotValid(methoargumentnotvalid exception ex,H

  ttpHeaders headers, HttpStatus status, WebRequest request) { // 此处自定义返回值 return super.handleMethodArgumentNotValid(ex, headers, status, request); }}可以看到handleMethodArgumentNotValid方法直接调用父类的方法,即使用默认的处理方式。

  

 

  从上图中可以看出返回值是空

  2、编写异常处理代码-返回值返回自定义内容

  

@Component@RestControllerAdvicepublic class RestExceptionHandler extends ResponseEntityExceptionHandler {@Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { // 此处自定义返回值 return super.handleMethodArgumentNotValid(ex, headers, status, request); } @Override protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { Set<HttpMethod> supportedMethods = ex.getSupportedHttpMethods(); // 自定义请求返回值 Map<String, Object> body = new HashMap<>(4); body.put("code", "错误码"); body.put("message", "当前请求的方法不支持,支持的请求方法为:" + supportedMethods); return new ResponseEntity<>(body, headers, status); }}

由上面的代码可知handleHttpRequestMethodNotSupported方法返回了自定义的body。

 

  

 

  从上图中可以看出,返回了我们自己定义的返回值。

  2、password参数传递exception1、使用ResponseEntityExceptionHandler或DefaultHandlerExceptionResolver处理

  

 

  由上图可知返回结果不对,我们需要自定义返回结果。

  2、返回自定义异常

  1、编写BizException处理代码

  

@RestControllerAdvicepublic class BizExceptionHandler { @ExceptionHandler(BizException.class) public ResponseEntity<Object> handleBizException(BizException exception) { // 自定义请求返回值 Map<String, Object> body = new HashMap<>(4); body.put("code", "错误码"); body.put("message", "异常信息为:" + exception.getMessage()); return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR); }}

2、测试返回结果

 

  

 

  从上图可知返回了自定义信息

  

 

  

四、注意事项

1、如果实现自定义异常处理类上使用@RestControllerAdvice注解方法上使用@ExceptionHandler来处理特定的异常

 

  2、ResponseEntityExceptionHandler默认处理那些异常

  

 

  3、使用了ResponseEntityExceptionHandler后,为什么发生了异常后返回体为空

  

 

  默认情况下,实现了 ResponseEntityExceptionHandler这个类后,这个类处理的所有异常的响应结果都是 null,如果想返回别的值需要我们自己去处理。

  

 

  

五、总结

1、如果我们想处理自定义异常,则可以使用 @RestControllerAdvice@ControllerAdvice 配置@ExceptionHandler来使用。

 

  2、如果我们实现了ResponseEntityExceptionHandler来处理异常,那么默认的异常的响应结果为空,如果想不为空,则需要我们自己处理。

  3、默认情况下,标准的Spring MVC异常会通过DefaultHandlerExceptionResolver来处理。

  

 

  

六、代码实现

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-exception-handler

 

  

 

  

七、参考文档

 

  到此这篇关于SpringBoot中异常处理的文章就介绍到这了,更多相关SpringBoot异常处理内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: