当前位置: 首页 > news >正文

controller需要捕获异常吗_Spring之Controller异常处理

b2453f7efe7d1f829d1931cad2c69e7d.png

在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 方法中统一进行处理

832af6d0829719e7421aac57d0bea2cc.png
  • 当通过Postman向 http://localhost:8088/Student/test1?a=0 发送请求,Controller方法由于除0而抛出ArithmeticException运算异常。Controller方法中抛出的异常会被与异常处理器所指定拦截的异常类型继承关系最近的异常处理器方法所拦截,所以,该运算异常被传递到运算异常处理器 handleException2 方法中统一进行处理

906001a856cd52f98dab6af1420bdd37.png
  • 当通过Postman向 http://localhost:8088/Student/test1?a=2 发送请求,Controller方法未抛出异常,方法按正常流程执行并返回预期结果

1846f64c0d6d1f2ed8bbee28d27666c4.png

@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著、张卫滨译

http://www.taodudu.cc/news/show-647652.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • mysql8中文排序_mysql中utf8编码的中文字段按拼音排序
  • html 分级切换菜单_FL studio系列教程(十六):FL Studio查看菜单讲解
  • mysql还原数据库后日期显示3000_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...
  • java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...
  • docker mysql sock_docker mysql安装
  • mysql最大述_mysql最大字段数量及 varchar类型总结
  • php协程实现mysql异步_swoole与php协程实现异步非阻塞IO开发
  • mysql中xml类型_使用 SQLXML 数据类型
  • mysql语法6_全面接触SQL语法(6)_mysql
  • sqlerver mysql_转 MYSQL学习(一)
  • tcpdump 识别成dns_dns tcpdump
  • java linkedhashmap_java学习-hashMap和linkedHashMap
  • 简单java题_java
  • java actionsupport_struts2中的Action接口和Actionsupport接口各有什么作用
  • java jar log4j_使用Log4j
  • java课程设计进程管理_GitHub - Shadow-Java/OS: 操作系统课程设计,关键词:进程同步与互斥、进程死锁、LRU页面替换算法、时间片轮转算法、时钟等...
  • mysql中建立索引的原则_在SQL数据库中设定索引的原则是什么?(注意是设定不是创建)...
  • java宝典_JAVA宝典之_JAVA基础
  • java blockingqueue_Java多线程进阶(三一)—— J.U.C之collections框架:BlockingQueue接口...
  • java 转账 锁_Java多线程 多个人转账发生死锁
  • java 静态变量 存储_Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分...
  • java坐标移动题目case_坐标移动
  • java代码实现购物车小程序_使用Taro实现小程序商城的购物车功能模块的实例代码...
  • php中怎么过滤器_PHP 过滤器
  • java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
  • java treeset 转array,Java TreeSet toArray(T[])用法及代碼示例
  • java佳沃维洛奇,新品速递:JAVA 双雄耀世登场
  • 如何建立分类模型matlab,创建简单模型 - MATLAB Simulink - MathWorks 中国
  • MATLAB已知坐标均匀取电,基于MATLAB带钢卷取电液伺服控制系统的分析(word文档良心出品)(11页)-原创力文档...
  • wordpress content.php,2020主题:content.php