文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot中异常处理实例分析

2023-06-30 11:56

关注

这篇文章主要介绍“SpringBoot中异常处理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot中异常处理实例分析”文章能帮助大家解决问题。

一、背景

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

二、需求

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

比如:

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

http的状态码:返回 405

{code: 自定义异常码,message: 错误消息}

实现自定义异常的拦截

拦截我们自己写的 BizException

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

引入jar包

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-validation</artifactId>    </dependency></dependencies>

注意:

引入spring-boot-starter-validation是为了验证请求的中的参数,然后当参数不满足时抛出异常。

定义一个自定义异常

public class BizException extends RuntimeException {    public BizException() {    }    public BizException(String message) {        super(message);    }    public BizException(String message, Throwable cause) {        super(message, cause);    }    public BizException(Throwable cause) {        super(cause);    }    public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {        super(message, cause, enableSuppression, writableStackTrace);    }}

解释

提供一个 /exception/password api,需要传递一个password参数

当不传递 password 参数时将抛出MethodArgumentNotValidException异常。

当password传递exception参数时,则抛出BizException异常。

测试

不传递password参数响应是什么

使用默认的DefaultHandlerExceptionResolver处理

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

SpringBoot中异常处理实例分析

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

SpringBoot中异常处理实例分析

使用ResponseEntityExceptionHandler处理

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

@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);    }}

可以看到handleMethodArgumentNotValid方法直接调用父类的方法,即使用默认的处理方式。

SpringBoot中异常处理实例分析

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

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

@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。

SpringBoot中异常处理实例分析

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

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

SpringBoot中异常处理实例分析

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

返回自定义异常

编写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);    }}

测试返回结果

SpringBoot中异常处理实例分析

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

四、注意事项

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

ResponseEntityExceptionHandler默认处理那些异常

SpringBoot中异常处理实例分析

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

SpringBoot中异常处理实例分析

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

关于“SpringBoot中异常处理实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯