当前位置: 首页 > java >正文

JAVA-springboot 异常处理

SpringBoot从入门到精通-第10章 异常处理

一、异常简介

传统的Java程序都是由try-catch语句捕捉异常,而Spring Boot项目采用了全局异常类的概念------所有方法均将异常抛出,并且专门安排一个类统一拦截并处理这些异常。这样做的好处是可以把异常处理的代码单独存储在一个全局异常处理类中。如果未来需要修改异常处理方案,就可以直接在这个全局异常处理类中进行修改。

二、拦截特定异常

为了拦截异常,Spring Boot提供了两个注解,即@ControllerAdvice和@ExceptionHandler()注解。

  • 其中@ControllerAdvice注解用于标注类,把被@ControllerAdvice注解标注的类称为全局异常处理类;
  • @ExceptionHandler()注解用于标注方法,把被@ExceptionHandler()注解标注的方法用于处理特定异常。
  • 使用@ControllerAdvice注解和@ExceptionHandler()注解拦截特定异常的语法如下:
@ControllerAdvice
public class TestContro { @ExceptionHandler(被拦截的异常类)public String exce(){}
}

2.1、先创建一个简单的springboot项目
在这里插入图片描述
在这里插入图片描述
编写控制器类TestContro:

package com.example._2025614spring_exception.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestContro {@RequestMapping("/exception")public String exce(){System.out.println("exce fun");return "exce_fun";}
}

在这里插入图片描述

2.2、准备创建正常数组访问的代码

package com.example._2025614spring_exception.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;@RestController
public class TestContro {@RequestMapping("/exception")public String exce(){ArrayList<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");System.out.println("list[2]"+list.get(2));System.out.println("exce fun");return "exce_fun";}
}

启动后访问,控制台输出:
在这里插入图片描述

2.3、准备创建让数组访问超出边界的代码

package com.example._2025614spring_exception.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;@RestController
public class TestContro {@RequestMapping("/exception")public String exce(){ArrayList<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");System.out.println("list[2]"+list.get(2));System.out.println("list[3]"+list.get(3));System.out.println("exce fun");return "exce_fun";}
}

2.4、启动正常,访问http://127.0.0.1:8080/exception
在这里插入图片描述
后台日志:
在这里插入图片描述

2.5、添加异常拦截,这时候启动程序,访问时没有报错打印出来,说明异常被拦截了在这里插入图片描述

package com.example._2025614spring_exception.controller;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
@ControllerAdvice
//@RestController
public class TestContro {@RequestMapping("/exception")@ExceptionHandler(ArrayIndexOutOfBoundsException.class)public String exce(){ArrayList<String> list = new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");System.out.println("list[2]"+list.get(2));System.out.println("list[3]"+list.get(3));System.out.println("exce fun");return "exce_fun";}}

在这里插入图片描述
在这里插入图片描述

三、打印异常日志

添加异常信息打印

package com.example._2025614spring_exception.controller;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.lang.reflect.Array;
import java.util.ArrayList;
@ControllerAdvice
@RestController
public class TestContro {@RequestMapping("/exception")@ExceptionHandler(ArrayIndexOutOfBoundsException.class)public String exce(ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界拦截到了,报错信息为:"+e);
//        ArrayList<String> list = new ArrayList<>();
//        list.add("aa");
//        list.add("bb");
//        list.add("cc");
//        System.out.println("list[2]"+list.get(2));
//        System.out.println("list[3]"+list.get(3));int[] arr = new int[]{1,2,3,4};System.out.println("arr[1]"+arr[1]);System.out.println("exce fun");return "exce_fun";}
}

访问:
在这里插入图片描述
在这里插入图片描述

四、缩小拦截异常的范围

4.1、拦截由某个或多个包触发的异常

@ControllerAdvice({"包名1", "包名2"})
@ControllerAdvice("包名")

4.2、拦截由某个或多个注解标注的类触发的异常

@ControllerAdvice(annotations={注解1.class, 注解2.class})
@ControllerAdvice(annotations=注解.class)

五、拦截自定义异常

  1. 创建自定义异常类,这个类必须集成RuntimeException运行时异常类,并重写父类的构造方法。
  2. 创建全局异常类,用于拦截自定义的异常。
  3. 创建控制器类,指定自定义异常的触发条件。
http://www.xdnf.cn/news/14140.html

相关文章:

  • 15故障排查
  • CAD中DWG到DXF文件解析(一)
  • ELK日志文件分析系统——E(Elasticsearch)
  • 【算法深练】二分答案:从「猜答案」到「精准求解」的解题思路
  • RT-Thread Studio SDK管理器安装资源包失败
  • 考研好?还是找工作好?
  • 灵界猫薄荷×贴贴诱发机制详解
  • 深度学习——基于卷积神经网络的MNIST手写数字识别详解
  • 【AS32系列MCU调试教程】驱动开发:AS32驱动库的集成与应用实例
  • Python经验,日志模块logging配置实现双重分割-同时添加时间和大小
  • Android 中 OkHttp 的自定义 Interceptor 实现统一请求头添加
  • BeckHoff_FB --> F_SEQ_X2_Robot 函数
  • Step-Audio-AQAA 解读:迈向「纯语音」交互的端到端 LALM 新里程
  • 【0.2 漫画操作系统原理】
  • 展开说说Android之Glide详解_源码解析
  • 通达信腾龙凤舞幅图指标公式
  • 前端异步编程基础
  • 经典蓝牙 vs BLE:10 大核心差异深度对比(附高频考点 + 大厂真题)
  • Kafka源码P1-消息ProducerRecord
  • LeetCode 第74题:搜索二维矩阵
  • jQuery.ajax() 方法核心参数详解
  • 从代码学习深度学习 - 子词嵌入 PyTorch版
  • C#最佳实践:为何要统一命名
  • 青少年编程与数学 01-011 系统软件简介 20 编译系统
  • awesome-llm-apps 项目带你探索语言模型的无限可能
  • 自恢复式保险丝如何实现自恢复?
  • 基于Python的TCP应用案例,包含**服务器端**和**客户端**的完整代码
  • frida-android-mod-menu 使用教程
  • LeetCode面试经典150题—旋转数组—LeetCode189
  • c++总结-05-模板与泛型编程