自定义异常处理(@ControllerAdvice 拦截异常)_@controlleradvice排除某个controller-程序员宅基地

技术标签: spring  java  

场景

当我们在处理项目出错的地方的时候(异常处理),往往不能给用户一个友好的提示(状态码、错误信息以及时间),下面我们一起来学习一个通用的自定义异常处理。

一、全局异常处理类

import com.leyou.common.exception.LyException;
import com.leyou.common.vo.ExceptionResult;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class CommonExceptionHandler {
    
    //  自定义异常
    @ExceptionHandler(LyException.class)
    public ResponseEntity<ExceptionResult> handlerException(LyException e){
    
        return ResponseEntity.status(e.getExceptionEnum().getCode()).body(new ExceptionResult(e.getExceptionEnum()));
    }
}

@ControllerAdvice 默认拦截所有的controller类
@ExceptionHandler(LyException.class) 拦截所有的LyException异常

我们可以发现这个异常类可以拦截所有的LyException异常,并且去处理。
ResponseEntity标识整个http相应:状态码、头部信息以及相应体内容。因此我们可以使用其对http响应实现完整配置。所以我们可以通过ResponseEntity来返回状态码和错误信息。
又因为我们在抛出异常的时候需要携带状态码和错误信息给用户,所以把异常信息定义成一个枚举类型,并且将返回结果封装成一个对象,下面通过代码向大家展示。

二、创建枚举

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ExceptionEnum {
    

//  类似单例,这相当于new一个对象,枚举的构造方法默认私有
    PRICE_CANNOT_BE_NULL("价格不能为空!", 400),
    CATEGORY_NOT_FOUND("商品分类没查到", 404),
    BRAND_NOT_FOUND("品牌列表不能为空", 404),
    BRAND_SAVE_ERROR("品牌保存失败", 500),
    UPLOAD_FILE_ERROR("文件下载失败", 500),
    INVALID_FILE_TYPE("无效的文件类型", 400)
    ;


    private String msg;
    private int code;

}

@Getter 自动注入get方法
@NoArgsConstructor 自动创建无参构造函数
@AllArgsConstructor 自动创建含有所有已声明字段属性参数的构造函数

我们可以把错误提示定义成一个个枚举。

三、自定义异常类

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class LyException extends RuntimeException {
    
    private ExceptionEnum exceptionEnum; //这是一个枚举
}

我们在创建异常对象的时候传入一个枚举就可以了。

四、定义结果类

创建这个类的目的是为了给用户返回一个结构清晰的提示信息

import com.leyou.common.enums.ExceptionEnum;
import lombok.Data;

@Data
public class ExceptionResult {
    
    private int code;
    private String msg;
    private Long timestamp;

    public ExceptionResult(ExceptionEnum em) {
    
        this.code = em.getCode();
        this.msg = em.getMsg();
        this.timestamp = System.currentTimeMillis();
    }
}

这个类包含状态码,错误信息以及时间,就可以向用户清楚的展示异常信息。

五、举例说明

在这里插入图片描述
假如我们在处理业务的时候可以抛出LyException异常这个异常将会被异常处理类CommonExceptionHandler的handlerException方法拦截并通过ResponseEntity返回状态码和异常信息。

总结

本文介绍了一个通用的自定义异常处理,这个可以广泛应用在我们的项目中,希望对你有帮助。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43373604/article/details/104952709

智能推荐

教育学相关期刊杂志介绍_河南中学生学习报是cn吗-程序员宅基地

文章浏览阅读2.7k次。期刊 审稿 主管/主办单位 刊号(CN) 级别 刊期 收录网站 栏目 儿童绘本(阅读与美育) 1周 吉林省舆林报刊发展有限责任公司主管主办 22-1406/J 省级 周刊 龙源 栏目:绘本·悦读、教学·设计、大语文·阅读、美育·艺术、一线·经验、家庭·教育、园所·天地、悦读宝贝/书香家庭、我是小艺术家 启迪与智慧(上旬) 3天 吉林出版集团股份有限公司主管 吉林省幽默与笑话杂志..._河南中学生学习报是cn吗

ESP8266学习——AP UDP Client_esp8226 udp client-程序员宅基地

文章浏览阅读338次。AP UDP Client内容步骤效果代码头文件宏定义全局变量关于ESP8266的代码ESP8266_AP_initESP8266_WIFI_Send_CbESP8266_WIFI_Recv_CbESP8266_NetCon_initOS_Timer_1_cbuser_init整体代码总结框架内容步骤同上一篇AP UDP Server几乎一样只是需要设置目标IP地址 ST_NetCon.proto.udp->remote_port = 8888; // 设置目标端口 ST_NetCon._esp8226 udp client

ftp 文件下载 linux,linux ftp命令使用,下载文件-程序员宅基地

文章浏览阅读552次。linux ftp命令使用,下载文件Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件Linux ftp命令的一般格式如下:$ ftp 主机名/IP最常用的命令有:ls 列出远程机的当前目录cd 在远程机上改变工作目录lcd 在本地机上改变工作目录ascii 设置文件传输方式为ASCII模式binary 设置文件传输方式为二进制模式close 终止当前的ftp会话has..._linux ftp下载文件目录的命令

Lambda表达式四大核心函数式接口——Java8新特性-程序员宅基地

文章浏览阅读309次。package com.atguigu.java8;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.function.Consumer;import java.util.function.Function;import java.util.functi...

读取多行数据到vector_不断读数据 vector-程序员宅基地

文章浏览阅读780次。要读取多行数据到vector,但是每行的数据个数又不一样,可以用到istringstream,先读取一行字符串,然后转化为字符串流,再从istringstream中读取数据#include&lt;iostream&gt;#include&lt;string&gt;#include&lt;sstream&gt;#include&lt;vector&gt;using namespac..._不断读数据 vector

mysql中int型和sqlserver中int_SQL里的int类型-程序员宅基地

文章浏览阅读470次。展开全部int、bigint、smallint 和 tinyint使用整数数据的精确数字数据类型。bigint从 -2^62616964757a686964616fe58685e5aeb93133336566356263 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。int从 -2^31 ...

随便推点

Android-自定义插件---彻底解决method-not-found-问题,android音视频开发方向_method not found: 'system.string system.appdomains-程序员宅基地

文章浏览阅读442次。基础库在迭代升级的时候 很可能要对某些方法进行修改,比如修改方法的返回值 ,修改方法的参数,甚至于要删除方法等等,但是如果你碰到上述的场景就要小心了,因为很多业务仓 依赖的还是老版本的基础库,他们运行是正常的,而你的新版本的基础库版本号提高以后删除了某个方法,假设他们又用到了这个方法,那么实际运行的时候 就会报method not found的 错误了。有人问 那你每次升级基础库的时候强制要求业务仓也跟着升级不就行了?当然是不行的。。。因为很多都是跨部门的业务,没有合理的理由 他们是不愿意 每次都跟着你的_method not found: 'system.string system.appdomainsetup.get_configurationfile

MATLAB GUI设计II 多功能模式题目生成器 四则运算 | 界面切换 | 字符串处理 | cell数组 | GUI_matlab算数题生成器-程序员宅基地

文章浏览阅读1.3k次,点赞9次,收藏12次。本GUI支持 界面切换 、界面可视化操作、基于cell数组的多数据存储与处理、混合模式选择、无括号的二级四则混合运算、多弹出式菜单选择、多单选按钮、多复选框、字符串处理、生成导出及引用文件 ;版本为R2018b 中文版本_matlab算数题生成器

实验吧-简单的登录题——WriteUp再研究_信安三勇-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏12次。前言这个题目的难点就是在于对于CBC加密方式尤其是解密这部分要琢磨一番,让我想起当年大学的时候信安三勇中的两勇的课,一门密码学,一门数学基础,可怕之极。这个题网上writeup一大堆,但是在一些方面解释的不是很详细,对大神们已经说的很清楚的地方我就粗略带过。CBC解密以及字节翻转攻击(cbc-byte-flipping-attack)我主要以CBC字符翻转 原理与实战这篇文章为基础..._信安三勇

++x和x++的区别_python中y=++x-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏24次。很多时候搞不清楚++x和x++的区别,其实只要多熟悉熟悉就能搞清楚了,x++是在进行其他操作之后,再给x加一,++x正好与其相反 int x=1;int y=2;int z=3;y=++x; //此处为第一情况,输出的值应该为2,2 因为x先自增,然后加一y=x++; //此处的值为1,2,因为计算步骤为先赋值再自增System.out.p_python中y=++x

来来来~ 码一万字,带你读懂JWT_jwt.decode-程序员宅基地

文章浏览阅读2.2k次。1. 为什么要用 JWT ?认证在谈起 JWT 之前,我们先了解一下什么是认证。在登录淘宝、微博等软件或者网站之前,我们需要通过填写账号和密码来校验身份。认证是用来验证用户身份合法性的一种方式。那我们登录成功之后,网站如何记录我们的身份信息呢?前面我们在学习 servlet 的时候,知道了传统的系统主要是通过 session 来存储用户的信息。session 将用户的信息存储在服务端。但是随着用户数量的增多,服务端就需要存一堆用户的认证信息,这种方式会不断增加服务端的压力.._jwt.decode

CESIUM例子学习(九)——Primitive(3)_polylinevolumegeometry-程序员宅基地

文章浏览阅读4.5k次。geometry实在是太多了,多也要一个一个地学。学习的过程中不仅仅是用Primitive加载各种geometry。在这个过程中也加深对cesium的印象,至少混过脸熟,然后熟就能生巧。特别是学习这种事,要自己亲手去做去练习才能有更好的体会。一、Polyline(线)cesium提供了SimplePolylineGeometry、PolylineGeometry、PolylineVolumeGeometry、PolylineVolumeOutlineGeometry、GroundP..._polylinevolumegeometry