码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SpringBoot——全局异常处理


    目录

    异常

    项目总结

    新建一个SpringBoot项目

    pom.xml

    Result(通用的响应结果类)

    MyBusinessException自定义异常类

    GlobalExceptionHandler全局异常处理类

    ExceptionController控制器

    SpringbootExceptionApplication启动类


    参考文章:

    • 1、http://t.csdnimg.cn/wzes2

    异常

    • SpringBoot项目采用了全局异常的概念——所有方法均将异常抛出,并且专门安排一个类统一拦截并处理这些异常。
    • 对异常的处理:
      • 1、抛出异常
      • 2、使用 try...catch...finally 捕获处理异常
    • SpringBoot提供了两个注解用于拦截异常
      • 1、@ControllerAdvice:标注该类为全局异常处理类,默认拦截所有被触发的异常
      • 2、@ExceptionHandler:标注方法,用于处理特定异常
    异常的分类
    java.lang.Throwable(所有异常类的根类)

    java.lang.Error

    (错误信息)

    • 由Java虚拟机生成并抛出
    • 这类错误一般不处理
    java.lang.Exception(异常信息)
    StackOverFlowError:栈空间溢出错误

    检查期异常

    • 在方法上固定存在的,如果调用了该方法就必须处理此异常

    java.lang.RuntimeException

    (运行时异常)

    OutOfMemoryError:内存溢出错误java.io.IOException:I/O异常java.lang.NullPointerException:空指针异常
    IllegalAccessError:非法的访问权限错误java.io.FileNotFoundException:文件找不到异常

    java.lang.IndexOutOfBoundsException

    和

    java.lang.ArrayIndexOutOfBoundsException:数组越界异常

    NoClassDefFoundError:JVM未找到类错误java.io.ClassNotFoundException:类找不到异常java.lang.IllegalArgumentException:非法参数异常
    NoSuchMethodError:JVM未找到方法错误java.lang.SecurityException:安全异常java.util.ConcurrentModificationException:修改状态异常

    项目总结

    • 统一异常处理通过@ControllerAdvice注解向控制器发送通知,并接收所有Controller层的通知,再结合@ExceptionHandler注解对指定的异常进行捕获处理,最后将结果返回给用户

    新建一个SpringBoot项目

    项目结构:

    pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.3.12.RELEASEversion>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.studygroupId>
    12. <artifactId>springboot_exceptionartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>springboot_exceptionname>
    15. <description>Demo project for Spring Bootdescription>
    16. <properties>
    17. <java.version>8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. <dependency>
    30. <groupId>org.projectlombokgroupId>
    31. <artifactId>lombokartifactId>
    32. dependency>
    33. dependencies>
    34. <build>
    35. <plugins>
    36. <plugin>
    37. <groupId>org.springframework.bootgroupId>
    38. <artifactId>spring-boot-maven-pluginartifactId>
    39. plugin>
    40. plugins>
    41. build>
    42. project>

    Result(通用的响应结果类)

    Result类的作用:

    1. 统一的响应格式:提高接口的一致性和可维护性。
    2. 封装错误信息:当发生异常或错误时,可以使用Result类来封装错误信息,包括错误消息和对应的状态码,便于客户端进行统一的处理和解析。
    3. 携带业务数据:除了错误信息,Result类也可以携带业务数据,例如查询结果、对象详情等,从而完整地描述接口的执行结果。
    1. package com.study.springboot_exception.event;
    2. import lombok.Data;
    3. @Data
    4. public class Result {
    5. private String message;
    6. private int code;
    7. private T data;
    8. }

    MyBusinessException自定义异常类

    1. package com.study.springboot_exception.exception;
    2. import lombok.Data;
    3. /**
    4. * 自定义异常类: 用于及时处理一些不符合业务逻辑的数据
    5. * 注意:
    6. * 1.必须继承RuntimeException运行时异常,并重写父类构造方法
    7. */
    8. @Data
    9. public class MyBusinessException extends RuntimeException{
    10. private static final long serialVersionUID=1L;
    11. private int code;
    12. private String message;
    13. public MyBusinessException(String message){
    14. super(message);
    15. this.message=message;
    16. }
    17. public MyBusinessException(int code,String message){
    18. super(message);
    19. this.code=code;
    20. this.message=message;
    21. }
    22. }

    GlobalExceptionHandler全局异常处理类

    • 比较常见的错误状态:
      • 200:正常响应
      • 400:错误的请求
      • 404:资源不存在
      • 500:代码无法继续执行
    • SpringBoot项目是Restful风格,大多使用@RestControllerAdvice注解
    1. package com.study.springboot_exception.exception;
    2. import com.study.springboot_exception.event.Result;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.web.bind.MethodArgumentNotValidException;
    5. import org.springframework.web.bind.MissingServletRequestParameterException;
    6. import org.springframework.web.bind.annotation.ExceptionHandler;
    7. import org.springframework.web.bind.annotation.RestControllerAdvice;
    8. import java.util.StringJoiner;
    9. /**
    10. * 全局异常处理类
    11. */
    12. @Slf4j
    13. @RestControllerAdvice//标记该类为全局异常处理类
    14. public class GlobalExceptionHandler {
    15. /**
    16. * 处理自定义异常
    17. */
    18. @ExceptionHandler(MyBusinessException.class)//处理特定异常
    19. public Result handleBizException(MyBusinessException ex){
    20. Result result=new Result<>();
    21. result.setCode(ex.getCode());
    22. result.setMessage(ex.getMessage());
    23. return result;
    24. }
    25. /**
    26. * 参数校验不通过异常
    27. */
    28. @ExceptionHandler(MethodArgumentNotValidException.class)
    29. public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
    30. StringJoiner sj=new StringJoiner(";");
    31. ex.getBindingResult().getFieldErrors().forEach(x -> sj.add(x.getDefaultMessage()));
    32. Result result=new Result<>();
    33. result.setCode(505);
    34. result.setMessage(sj.toString());
    35. return result;
    36. }
    37. /**
    38. * Controller参数绑定错误
    39. */
    40. @ExceptionHandler(MissingServletRequestParameterException.class)
    41. public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException ex){
    42. Result result=new Result<>();
    43. result.setCode(506);
    44. result.setMessage(ex.getMessage());
    45. return result;
    46. }
    47. /**
    48. * 其他未知异常(拦截的是全局最底层异常,兜底)
    49. */
    50. @ExceptionHandler(value=Exception.class)
    51. public Result handleException(Exception ex){
    52. Result result=new Result<>();
    53. result.setCode(507);
    54. result.setMessage("服务器内部错误");
    55. return result;
    56. }
    57. }
    58. ExceptionController控制器

      1. package com.study.springboot_exception.controller;
      2. import com.study.springboot_exception.event.Result;
      3. import com.study.springboot_exception.exception.MyBusinessException;
      4. import org.springframework.web.bind.annotation.GetMapping;
      5. import org.springframework.web.bind.annotation.RestController;
      6. /**
      7. * 处理系统中可能出现的两种异常:产品空指针异常和自定义异常
      8. */
      9. @RestController
      10. public class ExceptionController {
      11. /**
      12. * 系统内部错误
      13. */
      14. @GetMapping("/exception")
      15. public Result testException(){
      16. int i=1/0;//该语句会触发算数异常,进入全局异常处理类,所以不会执行下面的语句
      17. Result result=new Result<>();
      18. result.setCode(200);
      19. result.setMessage("success");
      20. result.setData("cc");
      21. return result;
      22. }
      23. /**
      24. * 自定义异常
      25. */
      26. @GetMapping("/myException")
      27. public Result testMyException(){
      28. throw new MyBusinessException(508,"自定义的异常");
      29. }
      30. }
      31. SpringbootExceptionApplication启动类

        1. package com.study.springboot_exception;
        2. import org.springframework.boot.SpringApplication;
        3. import org.springframework.boot.autoconfigure.SpringBootApplication;
        4. @SpringBootApplication
        5. public class SpringbootExceptionApplication {
        6. public static void main(String[] args) {
        7. SpringApplication.run(SpringbootExceptionApplication.class, args);
        8. }
        9. }

         启动项目

        • 访问网址:http://localhost:8080/exception
        • int i=1/0; 会触发算术异常,在全局异常处理类中归属“其他未知异常”来进行处理

        访问网址:http://localhost:8080/myException,触发自定义异常 

      32. 相关阅读:
        传输层 知识点总结
        Settings应用详情页面 & 安卓应用安装器 - com.google.android.packageinstaller
        pyqt5 嵌入WEB 并实现qt向web的通信
        视频分割合并工具说明
        JdbcTemplate环境准备_java培训
        fastadmin的导出到excel功能
        vue--后台管理系统问题和功能实现思路集锦
        C# 将PDF文档转换为Word文档
        类似Postman可视化API快速低代码工具生成源码
        【应用程序代理对象ApplicationDelegate-应用程序启动过程介绍 Objective-C语言】
      33. 原文地址:https://blog.csdn.net/weixin_72052233/article/details/139416912
        • 最新文章
        • 沪漂五周年了:我越来越迷茫了
          Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
          MySQL-Seconds_behind_master的精度误差
          [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
          AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
          Agent OS :五种驯服不确定性的范式
          PortSwigger SQL注入LAB11
          数据库即时编译JIT
          [Begin]AI Learn Data Day 0
          深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
        • 热门文章
        • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
          奉劝各位学弟学妹们,该打造你的技术影响力了!
          五年了,我在 CSDN 的两个一百万。
          Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
          面试官都震惊,你这网络基础可以啊!
          你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
          心情不好的时候,用 Python 画棵樱花树送给自己吧
          通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
          13 万字 C 语言从入门到精通保姆级教程2021 年版
          10行代码集2000张美女图,Python爬虫120例,再上征途
        小工具 小游戏
        Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

        京公网安备 11010502049817号