自定义异常处理演示

为了防止黑客从前台异常信息,对系统进行攻击。同时,为了提高用户体验,我们都会都抛出的异常进行拦截处理。

一、全局异常处理

编写一个异常拦截类,如下:@ControllerAdvice,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的Controller。使用这个Controller,可以实现三个方面的功能:①、全局异常处理;②、全局数据绑定;③、全局数据预处理;灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是SpringMVC提供的功能,在 Spring Boot中可以直接使用,下面分别来看。

自定义异常是继承自标准异常类(如ExceptionRuntimeExceptionThrowable)的用户定义的异常类。通过创建自定义异常类,开发者可以自定义异常消息、添加额外的属性和方法,以及更好地组织和处理程序中的异常情况。

Java标准库定义的常用异常包括:

Exception

├─ RuntimeException
│ │
│ ├─ NullPointerException
│ │
│ ├─ IndexOutOfBoundsException
│ │
│ ├─ SecurityException
│ │
│ └─ IllegalArgumentException
│ │
│ └─ NumberFormatException

├─ IOException
│ │
│ ├─ UnsupportedCharsetException
│ │
│ ├─ FileNotFoundException
│ │
│ └─ SocketException

├─ ParseException

├─ GeneralSecurityException

├─ SQLException

└─ TimeoutException

异常: 是程序本身可以处理的异常。也就是我们常见的空指针异常NullPointerException,数组超出范围异常IndexOutOfBoundsException等。

异常分为三种:
【1】检查性异常checked exceptions 编译器要求你必须处置的异常,在编译时可以检查出来。
【2】运行时异常unchecked exceptions 编译器不要求强制处置的异常,往往在运行时才检查出来。
【3】错误: 错误其实不算异常的一种,它是程序中无法处理的错误,它们在编译也检查不到的。

import com.edu.tools.R;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @description:
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    //很重要,括号类制定需要拦截的异常,也可以进行定制化
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        //R表示我们给前端返回的接口格式
        return R.error().message("执行全局异常处理。。。");
    }
}

二、全局异常处理测试

[点击并拖拽以移动]

三、自定义异常处理

【1】创建自定义异常类继承RuntimeException类。

/**
 * @description: 自定义异常类,包含了有参合无参构造器
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException {
    private Integer code;//状态码
    private String msg;//异常消息
}

【2】将自定义的异常类添加到拦截的Handler

/**
 * @description:
 * @author: zzx
 * @createDate: 2020/6/2
 * @version: 1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    //拦截自定义异常
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public R error(BusinessException e){
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}

【3】在业务代码根据需求进行手动抛出即可,业务代码展示:throw new BusinessException(20001,"手动异常抛出");

/**
 * <p>
 * 讲师 前端控制器
 * </p>
 *
 * @author zhengzhaoxiang
 * @since 2020-06-01
 */
@RestController
@RequestMapping("/eduservice/edu-teacher")
public class EduTeacherController {
    @Autowired
    private EduTeacherService eduTeacherService;

    /**
    * @Description 获取所有数据
    * @Author zhengzhaoxiang
    * @Date 2020/6/2 15:27
    * @Param []
    * @Return void
    */
    @GetMapping("findAll")
    public R findAll(){

        List<EduTeacher> list = eduTeacherService.list(null);
        try{
            int i = 1/0;
        } catch (Exception e){
            //手动抛出异常
            throw new BusinessException(20001,"手动异常抛出");
        }

        return R.ok().data("items",list);
    }
}

四、自定义异常处理测试

在这里插入图片描述

五、处理异常

【1】try/catch/finally

try {
      可能出现问题的代码;
} catch(异常类名 异常对象) {
      异常处理的代码
} finally {
    释放未关闭的资源 
}

举个栗子:

try {
    res= 1/0;
} catch (Exception e){
    System.out.println("计算异常");
    e.printStackTrace();
}

注意:
1、catch必须依赖于try,不能单独使用。
2、catch可以有多个。
3、finally在最后面可写可不写,主要用于释放资源。

【2】throwsthrow:我们有时没有权限或者不应该处理异常,我们可以将异常抛给调用者处理。

[访问权限修饰符] 返回值类型 方法名(参数列表) [throws 异常类名]{
方法体;
[return 返回值]; 
}

举个栗子:

//判断是否是三角形方法
public static void isTriangle(int a,int b,int c) throws IllegalArgumentException{//抛出一个非法的参数异常try {//把可能会出现异常的代码放在try...catch中
            if((a+b>c) && (b+c>a) &&(a+c)>b){
                System.out.println(a+"\t"+b+"\t"+c);
            }else {
                throw new IllegalArgumentException("不能构成三角形");//新建一个隐式异常的对象
            }
            //System.out.println(i1+"\t"+i2+"t"+i3);
        } catch (Exception e) {
            System.out.println("错误");
            e.printStackTrace();//上面Throwable类的成员方法:获取异常类名和异常信息,以及异常出现在程序中的位置
        }
    }

注意:
1、⼀个⽅法可以声明抛出多个异常,即throws后可以跟多个异常(如IllegalArgumentExceptionIOException),多个异常用逗号隔开。
2、throwthrows搭配一般用于自定义异常单独使用throw编译出错,报错信息:java:未报告的异常错误java.lang.Exception

六、总结

如果你希望自定义的异常是受检异常,需要在方法签名中声明或捕获,那么继承自Exception是合适的选择。这样可以明确告诉调用者需要处理该异常。比如处理文件操作时的异常情况。

如果你希望自定义的异常是运行时异常,不需要在方法签名中声明或捕获,那么继承自RuntimeException是更为常见的选择。这样可以让异常的使用更加灵活,不需要在每个方法中显式处理。比如处理数学计算中的非法参数异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/396413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商品图放大镜效果实现

业务拆解 鼠标经过商品小图&#xff0c;展示块会显示对应商品图片鼠标经过展示块&#xff0c;右侧会显示放大镜效果的大图大图可跟随鼠标移动而显示对应的部分 关键JS代码 // 1. 获取三个盒子// 2. 小盒子 图片切换效果const small document.querySelector(.small)// 中盒子…

极狐GitLab 如何配置多个 LDAP?

本文仅适用于极狐GitLab私有化部署场景。 场景化痛点 极狐GitLab 的多 LDAP 接入功能解决了企业在以下场景中可能遇到的痛点&#xff1a; 多个组织/部门的整合&#xff1a;在大型企业或跨国公司中&#xff0c;往往存在多个组织或部门&#xff0c;它们可能拥有独立的 LDAP 服务…

las数据转pcd数据

las数据转pcd数据 一、算法原理1.介绍las2.主要函数 二、代码三、结果展示3.1 las数据3.2 las转换为pcd 四、相关数据链接 一、算法原理 1.介绍las LAS文件按每条扫描线排列方式存放数据,包括激光点的三维坐标、多次回波信息、强度信息、扫描角度、分类信息、飞行航带信息、飞…

LeetCode算法实践——前缀和从入门到入土

前缀和算法 对于一个数组a&#xff0c;和为s数组&#xff1b;其每一个下标的前缀和为s[0]0,s[i]s[i-1]a[i]。 从上面可以推导出left到right之间的前缀和为是s[right1]-s[left]。 例如a[3,2,1,2]&#xff0c;对应的前缀和数组为s[0,3,5,6,8]。a的子数组[2,1,2]的和就可以用s[…

ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module

ubuntu22.04laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 使用 OpenCV DNN 模块进行图像分类3.1 导入模块并加载类名文本文件3.2 从磁盘加载预训练 DenseNet121 模型3.3 读取图像并准备为模型输…

用pandas做简单策略回测

一&#xff0c;RSI策略 数据&#xff1a; 代码 import pandas as pd# 读取贵州茅台股票历史交易数据 df pd.read_csv(贵州茅台股票历史交易数据.csv) missing_values df.isnull().sum()# print("缺失值数量&#xff1a;") # print(missing_values)# 计算RSI指标 …

Windows 使设置更改立即生效——并行发送广播消息

目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_5907…

PostgreSQL里实现计算多个数字的排列组合

在进行排列组合的时候&#xff0c;每一次需要知道是否有重复的值&#xff0c;并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断&#xff0c;并且可变参数使用variadic标记的数组。 postgres<16.1>(ConnAs[postgres]:PID[188277…

SICTF Round#3 wp web

web hacker sql无列名注入&#xff1b; 提示查询username参数&#xff0c;flag在flag表中&#xff1b; 传参测试发现&#xff0c;union select 可用&#xff0c;空格被过滤可以使用/**/代替 &#xff0c;or也被过滤了且无法大小写、双写等绕过&#xff0c;导致无法查询flag表…

在线SM3 HMAC加密工具

在线HMAC加密工具提供一站式服务&#xff0c;支持MD5至SHA512、RIPEMD160及SM3等多种哈希算法&#xff0c;用户可便捷选择算法并生成安全的HMAC散列值&#xff0c;确保消息完整性与验证来源。适用于开发调试、网络安全测试及敏感数据处理场景。 在线HMAC加密 - BTool在线工具软…

【VSCode编写JavaScript】

VSCode编写JavaScript ■ 下载安装VSCode■ VSCode统一配置■ 格式化工具■ Tab size &#xff08;代码缩进 2个字符&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7b79c59636f147c8b08a0fff37886e0a.png) ■ VSCode安装JS插件■ VSCode新建JS工程代码…

性能测试概述

1.性能测试介绍 好处: 有效的性能测试能给研发、运维团队提供有效的容量规划能力、系统风险识别、系统瓶颈识别、性能调优指导,保障尽量避免这些问题的发生。 例如: 假设:以下场景,不可用10分钟,带来的经济损失 天猫双十一峰值处理订单58.3万笔每秒 京东金融618战报…

fastApi笔记01-路径参数

路径参数 使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量" from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}") def read_item(item_id):return {"item_id": item_id} http://127.0.0.1:8000/i…

看小姐姐的效果棒极了,写了一个工具,逐帧解析视频转成图片,有没有带上商业思维的小伙伴一起研究下

一个突然的想法&#xff0c;促成了这个项目雏形。 原理是&#xff1a; 上传一个视频&#xff0c;自动将视频每一帧保存成图片 然后前端访问 就能实现如图效果 后端是python/flask 数据库mysql 前端uniapp 项目演示&#xff1a; xt.iiar.cn 后端代码如下&#xff1a; #学习…

蓝桥杯嵌入式STM32G431RBT6知识点(主观题部分)

目录 1 前置准备 1.1 Keil 1.1.1 编译器版本及微库 1.1.2 添加官方提供的LCD及I2C文件 1.2 CubeMX 1.2.1 时钟树 1.2.2 其他 1.2.3 明确CubeMX路径&#xff0c;放置芯片包 2 GPIO 2.1 实验1&#xff1a;LED1-LED8循环亮灭 ​编辑 2.2 实验2&#xff1a…

解决Edge浏览器,微博无法查看大图(Edge Image Viewer)

使用Edge浏览器浏览微博或其它带校验的图片时&#xff0c;会导致无法查看。 主要原因为Edge自带了一个Edge Image Viewer, 但是该图片查看器无法查看带校验数据的图片&#xff0c;所以导致查看时一片空白。 解决方法 地址栏输入 edge://flags/搜索 Edge Image Viewer选择 Disa…

c# #if 与 Conditional属性宏的区别

测试代码 using System; using System.Diagnostics;namespace ConsoleApp1 {public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){ #if Debug2Console.WriteLin…

【lesson59】线程池问题解答和读者写者问题

文章目录 线程池问题解答什么是单例模式什么是设计模式单例模式的特点饿汉和懒汉模式的理解STL中的容器是否是线程安全的?智能指针是否是线程安全的&#xff1f;其他常见的各种锁 读者写者问题 线程池问题解答 什么是单例模式 单例模式是一种 “经典的, 常用的, 常考的” 设…

【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 深度学习技术在无线通信领域的应用越来越广泛&#xff0c;特别是在非正交多址接入&#xff08;NOMA&#xff09;和正交频分复用&#xff08;OFDM&#xff09;系统中&#xff0c;深度学习技术被用来提高信道估计的性能和效率。…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1&#xff1a;安装jmeter 管理插件&#xff1a; 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;将下载下来的jar包放到jmeter文件夹下的lib/ext路径下&#xff0c;然后重启jmeter。 2&#xff1a;接着打开 选项-Plugins Ma…