全局异常捕获处理-@ControllerAdvice+@HandleException
涂涂影院管理系统这个demo中有个异常管理的标签,用于捕获 涂涂影院APP用户异常信息 ,有小伙伴好奇,排除APP,后台端的是如何处理全局异常的,故项目中的实际应用已记之。
关于目前的异常处理
在使用全局异常处理之前,就目前我们是如何处理程序中的异常信息的呢?
throws Exception + try-catch
怎么讲?
在我们目前项目中,往往事务发生在 Service 层,因为会牵扯到调用 Dao 跟数据库打交道,当数据库操作失败时,会让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚。
Service 抛出异常,那么 Controller 必然要去捕获,处理异常,所以,try-catch 就出现了。
看一下Service:
public interface ServiceI{
## 保存实体的方法
public Serializable save(Entity entity) throws Exception;
}
看一下Controller的某个调用方法:
@PostMapping(value = "")
public AppResponse add(@RequestBody Entity entity, Errors errors){
AppResponse resp = new AppResponse();
try {
Entity endity = new Entity();
endity.setXxx();
ServiceI.save(dog);
## 返回数据
resp.setData(newDog);
}catch (BusinessException e){
resp.setFail(e.getMessage());
}catch (Exception e){
resp.setFail("操作失败!");
}
return resp;
}
看上去也没什么别就,但是一个类中出现大面积的 try-catch ,就显得非常难看且冗余。
如果使用 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,只要设计得当,就再也不用在 Controller 层进行 try-catch 了。
书写全局异常处理
1. @ControllerAdvice注解
定义全局异常处理类,@RestControllerAdvice 为 @ResponseBody + @ControllerAdvice
@Slf4j
@RestControllerAdvice
public class RestCtrlExceptionHandler {
}
2. @ExceptionHandler注解
声明异常处理方法,方法 handleException() 就会处理所有 Controller 层抛出的 Exception 及其子类的异常,这是最基本的用法了。
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.OK)
public Result<Object> handleException(Exception e) {
String errorMsg = "Exception";
if (e!=null){
errorMsg = e.getMessage();
log.error(e.toString());
}
return new ResultUtil<>().setErrorMsg(500, errorMsg);
}
结合上边1、2组合一下:
@Slf4j
@RestControllerAdvice
public class RestCtrlExceptionHandler {
@ExceptionHandler(TmaxException.class)
@ResponseStatus(value = HttpStatus.OK)
public Result<Object> handleXCloudException(TmaxException e) {
String errorMsg = "Tmax exception";
if (e!=null){
errorMsg = e.getMsg();
log.error(e.toString());
}
return new ResultUtil<>().setErrorMsg(500, errorMsg);
}
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.OK)
public Result<Object> handleException(Exception e) {
String errorMsg = "Exception";
if (e!=null){
errorMsg = e.getMessage();
log.error(e.toString());
}
return new ResultUtil<>().setErrorMsg(500, errorMsg);
}
}
看一下 handleXCloudException() 方法
通常我们需要抛出我们自定义异常,而不是一有异常就全部进入 handleException 中,该方法中 TmaxException 即为我们自定义的异常。
@Data
public class TmaxException extends RuntimeException {
private String msg;
public TmaxException(String msg){
super(msg);
this.msg = msg;
}
}
这样,我们就可以在 Controller 中抛出我们定义的异常了,比如:
throw new TmaxException("连接ES失败,请检查ES运行状态");
如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

全局异常捕获处理-@ControllerAdvice+@HandleException的更多相关文章
- Spring-MVC开发之全局异常捕获全面解读
异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...
- springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...
- spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获 当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这 ...
- springboot编程之全局异常捕获
springboot编程之全局异常捕获 1.创建GlobalExceptionHandler.java,在类上注解@ControllerAdvice, 在方法上注解@ExceptionHandler( ...
- SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Asp.Net MVC3(三)-MvcApp实现全局异常捕获
定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...
随机推荐
- Jenkins+gitlab+msbuild
配置gitlab 这里会生成一个token在页面上方,一定要复制出来.存在别的地方. jenkins配置gitlab 在jenkins服务器上安装vs,目的是使用它的msbuild,如果项目中还用到了 ...
- LInux因为缺失网关出现Name or service not known的解决方法
笔者使用的VMware和CentOS 7.0.在安装完镜像包后,便开始配置静态ip.命令如下 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将BOOTPR ...
- Linux基础(02)MakeFile的创建和使用
makefile是生成文件的脚本 , 把当前文件下的.c文件生成.o文件和可执行程序 SRC = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SRC)) C ...
- stvd使用中的一些问题
1.stm8_interrupt_vector.c 会莫名其妙的自动出现,而且都是在项目目录下.进行如下操作 2.stvd编译时遇到no default placement for segment . ...
- CF891E Lust 生成函数
传送门 设在某一次操作之后的\(a\)数组变为了\(a'\)数组,那么\(\prod\limits_{i \neq x} a_i = \prod a_i - \prod a_i'\).那么就不难发现我 ...
- git 学习笔记 --从远程库克隆
上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...
- nmon2influxdb+grafana:服务监控可视化部署
在工作中,无论是定位线上问题,还是性能优化,都需要对前端.后台服务进行监控.而及时的获取监控数据,能更好的帮助技术人员排查定位问题. 前面的博客介绍过服务端监控工具:Nmon使用方法及利用easyNm ...
- C# 录音和变调
一直想研究下录音 正好有个项目有机会使用一下强大的 NAudio (https://github.com/naudio/NAudio)库 录音 NAudio 录音类库 public class NAu ...
- 又一个秘密如何让浏览器访问最新的js,css等外部引用
在引用文件末尾加上一个参数,让浏览器知道这个文件跟上一个文件是不同的,让浏览器去服务器重新加载最新的,例如:<script type="text/javascript" sr ...
- JAVA基础之设置随机成语验证码
package com.oracle; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ja ...