在Spring Web后端开发中,对于Controller方法的异常一般都需要特别处理,以防止将异常信息抛给前端或用户。但是如果在各个Controller方法中通过try-catch来捕获处理,不仅繁琐而且代码也不够简洁优雅。这里我们介绍如何通过@ExceptionHandler、@ControllerAdvice注解实现对Controller方法异常的统一处理

@ExceptionHandler 异常处理器注解

该注解标注的方法(即异常处理器),可以对其所在类的中的所有Controller方法(即@RequestMapping注解标注的方法)抛出的异常进行拦截,以便统一处理。同时可在该注解上指定所需捕获的异常类型。同时该方法也支持通过添加@ResponseBody注解来向前端返回请求的响应结果。下述代码即是一个该注解的使用实例

@Controller
@RequestMapping("Student")
public class StudentController {  /*** 异常处理器* @param e* @return*/@ResponseBody   // 通过异常处理器方法统一返回响应结果@ExceptionHandler(Exception.class)public String handleException1(Exception e) {String msg = "Get Exception In handleException1 Method";System.out.println("msg: " + msg);return msg;}/*** 运算异常处理器* @param e* @return*/@ResponseBody   // 通过异常处理器方法统一返回响应结果@ExceptionHandler(ArithmeticException.class)public String handleException2(ArithmeticException e) {String msg = "Get ArithmeticException In handleException2 Method";System.out.println("msg: " + msg);return msg;}@ResponseBody@RequestMapping("/test1")public Integer test1(@RequestParam int a) {int b = 10 / a;System.out.println("b: " + b);return b;}
}

  • 当通过Postman向 http://localhost:8088/Student/test1?a=tony 发送请求,Controller方法由于方法参数类型错误而抛出异常,然后该异常被传递到异常处理器 handleException1 方法中统一进行处理
  • 当通过Postman向 http://localhost:8088/Student/test1?a=0 发送请求,Controller方法由于除0而抛出ArithmeticException运算异常。Controller方法中抛出的异常会被与异常处理器所指定拦截的异常类型继承关系最近的异常处理器方法所拦截,所以,该运算异常被传递到运算异常处理器 handleException2 方法中统一进行处理
  • 当通过Postman向 http://localhost:8088/Student/test1?a=2 发送请求,Controller方法未抛出异常,方法按正常流程执行并返回预期结果

@ControllerAdvice 控制器通知注解

虽然异常处理器大大方便了我们对于Controller方法中异常的处理,但是通常在一个项目中有多个Controller类,如果在每个Controller类添加重复的异常处理器方法显然不够简洁优雅。比较容易想到的优化方案是将异常处理器方法放在Controller基类中,其他Controller类通过继承该基类来获得异常处理器,但是由于Java的单继承问题,会使得其无法再继承父类容易产生不便;还有一种优化方案是通过接口的默认方法实现(该特性从JDK 8开始支持),但是这样需要其他Controller类都需要显式地实现该接口,稍微有点麻烦。为此Spring FrameWork提供了一个控制器通知注解——@ControllerAdvice

@ControllerAdvice注解所标识类的异常处理器方法将会对项目中所有标注了@RequestMapping注解的方法生效(即项目中所有的Controller方法),这样我们就可以很方便地统一处理所有Controller方法所抛出的异常,同时保证了Conrotller类的简洁。值得一提的是@ControllerAdvice注解本身已经使用了@Component注解

/*** 所有Controller方法统一的异常处理:Controller异常处理器通知*/
@ControllerAdvice
public class ControllerExceptionHandler {/*** 异常处理器* @param e* @return*/@ResponseBody@ExceptionHandler(Exception.class)public String handleException1(Exception e) {String msg = "Get Exception In handleException1 Method";System.out.println("msg: " + msg);return msg;}/*** 运算异常处理器* @param e* @return*/@ResponseBody@ExceptionHandler(ArithmeticException.class)public String handleException2(ArithmeticException e) {String msg = "Get ArithmeticException In handleException2 Method";System.out.println("msg: " + msg);return msg;}
}
...
@Controller
@RequestMapping("Student")
public class StudentController
{  ...@ResponseBody@RequestMapping("/test1")public Integer test1(@RequestParam int a) {int b = 10 / a;System.out.println("b: " + b);return b;}...
}

参考文献

  1. Spring实战 Craig Walls著、张卫滨译

controller需要捕获异常吗_Spring之Controller异常处理相关推荐

  1. SpringMVC从Controller跳转到另一个Controller

    [PK亲测] 能正常跳转的写法如下: return "forward:aaaa/bbbb.do"; return "redirect:aaaa/bbbb.do" ...

  2. springboot controller访问不到_Spring Boot 开篇:快速入门

    背景 想想之前搭建一个WEB项目,不管项目的功能简单或复杂,都需要哪些步骤: 配置 web.xml,加载 Spring 和 Spring mvc 配置数据库连接.配置 Spring 事务 配置加载配置 ...

  3. springboot 上传异常捕获_Spring Boot 全局异常处理(下)

    可以搜索微信公众号[Jet 与编程]查看更多精彩文章 背景 在上篇[链接]中介绍了 Spring Boot 全局异常处理的一种方式,但那是一种全局性的容错机制,目的是把 Spring Boot 默认的 ...

  4. SpringMVC中Controller跳转到另一个Controller方法

    1.直接Redirect后加 Controller/Action Response.Redirect("/User/Edit"); // return Redirect(" ...

  5. ajax传值controller怎么写,关于ajax请求Controller传值问题详细记录

    请求基本样式 ajax请求接口: (1) 接口: @RequestMapping(value="/test",method=RequestMethod.POST) public v ...

  6. JMeter Logic Controller(逻辑控制器)之 ForEach Controller(循环控制器)

    官方文档:http://jmeter.apache.org/usermanual/component_reference.html#ForEach_Controller 1.ForEach Contr ...

  7. java默认异常处理_spring boot 默认异常处理的实现

    本周在看陈杰写的自定义异常的微信异常时,使用的是自定义异常状态码和信息,在出错时将他抛出,并用@ExceptionHandler注解定义一个全局异常处理器,根据异常的内容向前台发送状态码和信息,处理异 ...

  8. java 捕获异常并存入数据库_java异常处理,报异常的话怎么处理对象值,并持久化到数据库中...

    展开全部 //没看到有人回e68a843231313335323631343130323136353331333365646233答你,我还没学到框架,不知道那个是不是可以很便捷操作你说的这样过程 / ...

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

    Controller层.Filter层.Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结 ...

最新文章

  1. golang OOP面向对象
  2. crt python_SecureCRT Python
  3. Windows x64内核学习笔记(三)—— SMEP SMAP
  4. mysql 5.7.14编译安装_源码编译安装mysql-5.7.14-阿里云开发者社区
  5. python从数分到数编(part1)--基础
  6. 计算机网络第4章(网络层)
  7. 大数据项目开发案例_大数据开发相关术语解析
  8. iOS 网络编程(二)
  9. LIRe提供的图像检索算法的速度
  10. php上证指数抽奖代码,[高手指点] 美团网的抽奖是什么原理?
  11. 飞客蠕虫病毒?分析、定位、处理
  12. Retinex算法--低照度图像增强
  13. 深海迷航坐标传送代码_深海迷航代码输入方法
  14. 关于BUCK-BOOST电路的负压生成
  15. 通过spi调试linux应用程序,654123??SPI linux 驱动调试感悟
  16. 华为S6720-LI系列交换机光模块解决方案
  17. 信息学奥赛一本通 1325:【例7.4】 循环比赛日程表
  18. python你已经是个成熟的软件了_支付宝改自己还花呗表情包_你已经是个成熟的软件系列表情包大全_游戏吧...
  19. 关于网线,你了解多少?
  20. 微耕门禁显示通信不上服务器,微耕中性门禁控制器通讯不上是怎么回事?主要有什么注意事项...

热门文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
  2. oracle逻辑备份和物理备份,oracle数据库物理备份和逻辑备份区别
  3. Qt与Tomcat服务器通信实例 post方法提交
  4. lisp如何将度分秒转换为弧度_地学中常用度、度分、度分秒,弧度、角度在MATLAB中的转换...
  5. 多线程处理同一批数据_多进程和多线程的优缺点
  6. 杨辉三角形递归c语言,关于【杨辉三角】的递归解决方法,请教。有没有大神【【高手】】...
  7. cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享
  8. python自动发送微信-Python自动定时发送微信消息
  9. 平板电脑显示服务器繁忙,微信公众平台微信保护-微信公众平台登陆系统繁忙是什么原因登陆的时候有个微信扫描认证?微 爱问知识人...
  10. node.js mysql 不退出,mysql - 错误:使用NodeJS在MySQL中调用退出后无法排队查询 - SO中文参考 - www.soinside.com...