controller层统一处理异常

SpringBoot接口 - 如何优雅的写Controller并统一异常处理? 为什么要优雅的处理异常实现案例@ControllerAdvice异常统一处理Controller接口运行测试进一步理解@ControllerAdvice还可以怎么用?@ControllerAdvice是如何起作用的(原理)?示例源码更多内容SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例,如何优雅的将参数校验的错误信息统一处理并封装返回呢?@pdai为什么要优雅的处理异常那怎么实现统一的异常处理,特别是结合参数校验等封装? 阅读详情

@ExceptionHandler 统一处理异常

1. 知识

@ExceptionHandler:用于在特定处理程序类和/或处理程序方法中处理异常的注释。

使用该注释注释的处理程序方法允许具有非常灵活的签名。它们可以有下列类型的参数,按任意顺序排列:

  • 1.异常参数:声明为一般异常或更具体的异常。若要声明更为具体得参数,可用value来确定
  • 2.请求和/或响应对象(通常来自Servlet API),可以选择任何特定的请求/响应类型:如 javax.servlet.http.HttpServletRequest
  • 3.会话对象:通常是javax.servlet.http.HttpSession,这种类型的参数将强制出现相应的会话,参数不能为空,
  • 4.当前请求区域设置的java.util.Locale
  • 5.java.io.InputStream / java.io.Reader访问请求的内容

(参考翻译来自源码的文档)

目前只用过第一种,用来处理异常。 回顾之前java异常处理 主要有这几个关键字:try catch finally throw throws 如果要抛出具体明确的异常,则可以用 try catch来捕捉,若有些异常不做处理 直接抛出,则可以使用 throw(主要是在语句抛出),throws(主要是在方法上抛出);试想以前的代码,有时一段代码,业务逻辑如果复杂,一个try就有多个catch,代码看起来就给人一种很冗余的感觉;使用@RestControllerAdvice @ExceptionHandler统一拦截异常处理 争对不同的异常抛出,我可以做不同的异常拦截,对拦截的异常信息做统一处理(统一数据格式)再返回前端,即使发生错误,错误信息的可读性也好,也能更快锁定问题。

插曲:

@RestControllerAdvice 和 @ControllerAdvice有何区别? 如下是@RestControllerAdvice注解的源码,可以看出@RestControllerAdvice包含了 @ControllerAdvice+@ResponseBody两个注解,若要使用@ControllerAdvice结合@ExceptionHandler作为异常统一拦截(返回json数据格式),则需要再加一个注解@ResponseBody

image.png

2.举例

  • 2.1 统一异常处理
@RestControllerAdvice
@Slf4j
@Order(Ordered.HIGHEST_PRECEDENCE)
public class OverallExceptionHandler {

    @ExceptionHandler
    public CommonResult handException(Exception e){
        return CommonResult.errorResult(ResultCode.SYSTEM_ERROR,e.getMessage());
    }

    @ExceptionHandler(value = UserException.class)
    public CommonResult handUserExceptionHandler(UserException e){
        return CommonResult.customErrorResult(null,e.getMessage(),null);
    }
    ```
  /**
  * 参数不可读
   */
   @ExceptionHandler(value = HttpMessageNotReadableException.class)
    public CommonResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
     return CommonResult.errorResult(ResultCode.PARAM_IS_INVALID, e.getMessage());
}

}
复制代码

handException方法主要拦截:没有被拦截处理的异常信息

handUserExceptionHandler:拦截主动抛出的异常信息(这个异常是自己自定义的异常信息)

handleHttpMessageNotReadableException:拦截参数不可读异常 这个异常时jdk里面自带的异常(正如上面所说 对于不同的异常 可以做不同的拦截处理,返回的错误信息也可以自己自定义 这样的错误提示能更快定位问题)

  • 2.2 自定义异常
public class UserException extends RuntimeException{
    private static final long serialVersionUID = 1L;
    private String code;

    public UserException() {
        super();
    }

    public UserException(String message) {
        super(message);
        this.code = ResultCode.EXISTING_ASSOCIATED_DATA.getCode();
    }

    public UserException(String code, String message){
        super(message);
        this.code = code;
    }

    public UserException(String message, Throwable cause) {
        super(message, cause);
    }

    public UserException(Throwable cause) {
        super(cause);
    }
}
复制代码

自定义异常 有些异常java中可能没包含的异常 自己也可以自定义 这些异常也可用拦截器进行拦截处理 只需要@ExceptionHandler(value = UserException.class)这样就可以拦截到自定义的异常

  • 2.3 controller层写的一个测试方法
@PostMapping(value = "/testException")
public void test1(){
 throw new UserException("这是我抛出得一个异常");
}
复制代码

这个异常只是一个测试(自定义的异常) 直接抛除一个异常 这个异常会被统一拦截器做拦截处理 其返回的内容如下(返回了一个标准的json数据格式):

image.png

再看一个例子: 这个是java自带的异常 若抛出异常 则回被拦截到handException方法里做相应的处理:

@PostMapping(value = "/testException")
public void test1() throws FileNotFoundException {
    File file = new File("D:222.pdf");
    FileInputStream inputStream = new FileInputStream(file);
复制代码

也返回的时标准的json数据格式:

image.png

而如果用try-catch去做处理:

@PostMapping(value = "/testException")
public void test1(){
    File file = new File("D:222.pdf");
    try {
        FileInputStream inputStream = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
复制代码

则不会做任何拦截 前端也没有收到相应明确的错误提示

3.总结

controller层 结合@RestControllerAdvice和@ExceptionHandler实现统一异常拦截器,这样的好处在于,可以减少一些冗余代码,能更突出自己的核心业务逻辑代码,统一处理后向前端返回统一的json数据格式

【项目实战】使用@ControllerAdvice+@RestControllerAdvice注解,实现全局统一异常处理 在Spring里,可以使用@ControllerAdvice来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。@ControllerAdvice是在类上声明的注解, 是@Controller注解的一个增强,这个注解是Spring里面的东西,可以处理全局异常。@ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的; 阅读详情

相关推荐

SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕获与处理

在编写Controller接口时,为避免接口因为未知的异常导致返回不友好的结果和提示。如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。可以对Controller进行全局的异常捕获和处理,一旦发生异常,则返回通用的500响应码与通用错误提示。并将异常发生的具体的文件、类、方法、行数信息记录到日志。@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,

BADAO_LIUMANG_QIZHI的博客 4401

controller层统一处理异常,附Java面经

} 复制代码 handException方法主要拦截:没有被拦截处理的异常信息 handUserExceptionHandler:拦截主动抛出的异常信息(这个异常是自己自定义的异常信息) handleHttpMessageNotReadableException:拦截参数不可读异常 这个异常时jdk里面自带的异常(正如上面所说 对于不同的异常 可以做不同的拦截处理,返回的错误信息也可以自己自定义 这样的错误提示能更快定位问题) 2.2 自定义异常 public class UserException e

m0_64383449的博客 595

Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建

前面分别叙述了《Zynq-PS-SDK(9) 之 VDMA》、《Zynq-PS-SDK(10) 之 VTC》以及《Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out》;搭建一个简单的视频通路(Framebuffer -> HDMI)就要用到这些个模块,总体的设计框图如下所示: 视频数据的 Framebuffer 在 DDR 中,通过 Processing System 写入进去; 数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带

StephenZhou 5589

统一异常处理@ControllerAdvice及参数校验@Validated

一、异常处理 有异常就必须处理,通常会在方法后面throws异常,或者是在方法内部进行try catch处理。直接throws Exception 直接throws Exception,抛的异常太过宽泛,最好能抛出准确的异常,比如throws IOException之类。 User getUserById(Integer id) throws IOException,BusinessExcep...

Cyms,BgXmSfXtsj !!!! Battle Each Moment !!!! 633

通讯模块_三菱IQ-R PLC串口通讯模块RJ71C24进行Modbus-RTU通讯

在日常的选型中,很多电气工程师咨询我,三菱iQ-R系列有没有Modbus通讯模块,我在这里可以肯定的回复您,这个肯定是有的;我们共有三种可以选择分别是RJ71C24、RJ71C24-R2、RJ71C24-R4。RJ71C24系列支持MC协议通信、通信协议通信、无顺序协议通信、双向协议通信全、MODBUS通信。当我帮助他们选型之后,他们在使用的时候,又是一头雾水。那么今天我抽一些时间讲解一RJ71...

weixin_39878549的博客 9269

Applied Intelligence投稿经验分享(正在投稿中)

这几天在投稿Applied Intelligence这个期刊,过程很曲折,反反复复,因此写一篇经验分享,希望能记录一下自己的过程,也能给其他人一些帮助(可以在评论区讨论),提醒一下,一定要写一些声明,不会写、不知道写啥就看第四章的第二个问题。

weixin_55988068的博客 1万+

Spring中Controller层、Filter层、Interceptor层全局统一异常处理

Controller层、Filter层、Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结了一下统一异常处理的办法,让异常处理变得上流。 本片文章较长,我先定义以下后面会用到的类 /** * @author ht113 * * 错误dto,就是从后端返回到前端的错误信息,下面这个作为例子比较简单 */ @Data public class ErrorInfo { String d

include的博客 4856

基于aarch64分析kernel源码 六:kernel_init进程(1号进程)、kthreadd进程(2号进程)

kernel_init进程(1号进程)、kthreadd进程(2号进程)分析

OnlyLove_的博客 764

Controller层的异常统一处理及返回

Controller层的异常统一处理及返回 Controller层的异常统一处理及返回 一、为什么要做这件事? 不知道你平时在写Controller层接口的时候,有没有注意过抛出异常该怎么处理,是否第一反应是想着用个try-catch来捕获异常? 但是这样地处理只适合那种编译器主动提示的检查时异常,因为你不用try-catch就过不了编译检查,所以你能主动地抓获异常并进行处理。但是,如果存在运行时...

stay hungry,stay foolish! 7761

手把手教你用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD)

本文详细介绍了如何使用Isograph Reliability Workbench 14.0绘制可靠性方框图(RBD),从软件安装、界面设置到基础项目创建和高级功能应用,手把手指导工程师完成系统可靠性分析。通过实际案例演示,帮助用户掌握RBD建模技巧,提升系统可靠性评估效率。

weixin_26765287的博客 623

低功耗边缘设备部署指南:YOLO26 INT8量化与TensorRT加速全流程

将YOLO26 INT8部署到低功耗边缘设备,核心原则是“校准为王、敏感层精准回退、端到端验证”。校准集≥500张,来自真实推理场景,未经训练增强校准集预处理与推理pipeline逐行对齐trtexec命令必带--fp16作为fallback量化后用polygraphy定位敏感层,而非盲猜仅回退必要层(通常2-3个),保留INT8收益在真实部署场景测试集上验证mAP,不以COCO为准C++部署使用异步推理+双缓冲nsys profiling确认无传输瓶颈。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 212

Controller 层异常统一处理的方式

Controller层方法,进行统一异常处理 Controller层方法,进行统一异常处理 提供两种不同的方案,如下: 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionHandler 注解实现; 方案2: 使用AOP技术实现; 现在分别介绍 方案1: 使用@ControllerAdvice 和 @Excepti...

HeatDeath的博客 3518

嵌入式工程师成长之路(2)——电路设计

为什么你的电源模块总是发热炸机?DC/DC和LDO选型的“潜规则”你踩坑了吗? LM2596降压芯片用错电容导致输出振荡?LED恒流驱动设计让灯珠寿命缩水50%?24V转12V方案成本超预算被老板狂喷?——这些血泪教训,谁能懂得!

云轩阁 13万+

【异常处理】Springboot对Controller层方法进行统一异常处理

【异常处理】Springboot对Controller层方法进行统一异常处理

w36680130的博客 951

TC3XX - MCAL知识点(九):PWM EB-tresos配置说明及代码浅析

脉冲宽度调制(PWM)驱动器负责提供与AUTOSAR指定的PWM信号生成相关的标准服务。PWM通道的底层定时器驱动是GTM (TOM或ATOM片)或CCU6 (T12或T13片)定时器通道。软硬件匹配关系如下:PWM直接引用的是GTM与CCU6模块,然后GTM与CCU6再关联到Port的,根据软硬件匹配关系,也能调用中断来使用,本例子没使用中断。CCU6是一个高分辨率的16位捕获和比较单元,具有特定的应用模式,主要用于交流驱动控制。特殊的工作模式支持控制无刷直流电机使用霍尔传感器或反电动势检测。

梦想技术家 2885

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java异常统一处理,Controller层的异常统一处理及返回

Controller层的异常统一处理及返回一、为什么要做这件事?不知道你平时在写Controller层接口的时候,有没有注意过抛出异常该怎么处理,是否第一反应是想着用个try-catch来捕获异常?但是这样地处理只适合那种编译器主动提示的检查时异常,因为你不用try-catch就过不了编译检查,所以你能主动地抓获异常并进行处理。但是,如果存在运行时异常且你没有来得及想到去处理它的时候会发生什么呢?...

weixin_39829497的博客 2085

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ControllerAdvice实现SpringBoot中Controller层异常统一处理

由于controller层直接由页面调用,项目要求controller层统一处理异常信息,不能将异常信息展示给用户。 SpringBoot项目中可以使用ControllerAdvice和ExceptionHadl

李永亮的博客 523

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

如何统一处理controller层的异常并返回

这几天在跟同事调接口过程中,经常遇到接口返回对方异常堆栈的错误信息。很明显是异常没有进行处理。一般我们会用标准的try-catch来捕获异常。 但是这样地处理只适合那种主动提示的检查时异常,因为你不用的try-catch就过不了编译检查,所以你能主动地抓获异常并进行处理。但是,如果存在运行时异常,你没有来得及想到去处理它的时候会发生什么,我们可以来先看看下面的这个没有处理运行时异常的例子? @...

fengyuwuzuqcc的博客 1922

springboot 监听所有异常_【异常处理】Springboot对Controller层方法进行统一异常处理...

Controller层方法,进行统一异常处理提供两种不同的方案,如下:方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionHandler 注解实现;方案2: 使用AOP技术实现;现在分别介绍方案1: 使用@ControllerAdvice 和 @ExceptionHandler@ControllerAdvice 或 @Rest...

weixin_36435325的博客 477

【统一异常处理】@ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常

1.利用springmvc注解对Controller层异常全局处理 对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚。 如此一来,我们的 Controller 层就不得不进行 try-catch Service 层的异常,否则会返回一些不友好的错误信息到客户端。...

966

微服务系列之SpringBoot基础:全局异常拦截和统一处理controller层接口返回

SpringBoot全局异常拦截统一处理和拦截controller返回结果进行加工

kuangpengfei的博客 2211

spring mvc controller层 做统一异常处理

流程 :   dao层异常向上service层抛,service异常继续向controller层抛,controller 层再抛;   定义类似拦截异常的类  用spring 的 @ControllerAdvice 和@ExceptionHandler注解 实现对异常的拦截并处理, 代码如下:   在 GlobalExceptionHandler类中定义拦截的异常类型...

qq_16092283的博客 2239
上一篇: 通过源码认识设计模式-装饰器模式(JAVA I/O流)
下一篇: 统一处理controller层接口返回的数据
普通网友
博客等级 码龄5年 3419粉丝 477原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值