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

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. 创建控制器类,指定自定义异常的触发条件。

相关文章:

  • C#入门学习笔记 #9(析构器、类声明、访问控制、继承、重写、多态、抽象类、开闭原则)
  • C#里与嵌入式系统W5500网络通讯(6)
  • ES知识合集(四):高级篇
  • Odoo 为特定产品主数据设置质检控制点,以实现在采购收货或生产过程中自动触发质量检查
  • 【Elasticsearch】分词机制详解(含实战案例)
  • Vue动态路由
  • webuploader分片上传示例,服务端上传文件到腾讯云CDN Teo 应用示例
  • 《Elasticsearch 分布式搜索在聊天记录检索中的深度优化》
  • Boost dlib opencv vs2022 C++ 源码安装集成配置
  • Vue3 + TypeScript + Element Plus 使用【设置表格列宽,组合式函数 hook】在原有页面实现表格列宽设置本地持久化实例总结
  • 使用 FastMCP 实现 Word 文档与 JSON 数据互转的 Python 服务
  • C++ RPC 远程过程调用详细解析
  • STM32 vs RT1176:正交编码器实现原理与工程实践全解析
  • [智能客服project] AI提示词配置 | 主协调器 | 闲鱼协议工具
  • 是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明
  • PyCharm 中更改缓存和插件目录
  • 19.vue.js的style的lang=scss、less(2)
  • 函数式编程 stream流 lambda表达式
  • 龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数
  • UI设计中的大数据可视化:让数据“说话”
  • 普升高端品牌网站建设/做外贸推广
  • 网站建设浏览器不兼容/搜索引擎技术优化
  • 安丘网站建设报价/淘宝关键词指数
  • 电商品牌排行榜/长沙网站优化排名推广
  • 易语言 做的网站/seo营销专员
  • 网站免费建站o/营销策划咨询机构