springMVC 统一异常处理异常处理类的使用

举报
tea_year 发表于 2021/12/23 00:33:50 2021/12/23
【摘要】  在项目开发中各层中都会不可避免的遇到各种可预知和不可预知的异常需要处理,为只专注业务逻辑的实现,需要将异常信息进行统一管理维护处理。          springmvc就是将异常层层向外抛出,最后由springmvc的前端控制器调用异常处理组...

 在项目开发中各层中都会不可避免的遇到各种可预知和不可预知的异常需要处理,为只专注业务逻辑的实现,需要将异常信息进行统一管理维护处理。

         springmvc就是将异常层层向外抛出,最后由springmvc的前端控制器调用异常处理组件HandlerExceptionResolver(处理器异常解析器)进行处理
————————————————

统一处理某一类异常,能够减少代码的重复度和复杂度,有利于代码的维护。springmvc统一处理异常有三种方式

  • @ExceptionHandler

    使用@ExceptionHandler注解作用在方法上面,参数是具体的异常类型。一旦系统抛出这种类型的异常时,会引导到该方法来处理。但是它的缺陷很明显

处理异常的方法和出错的方法(或者异常最终抛出来的地方)必须在同一个controller,不能全局控制。


  
  1. @RequestMapping(value = "/error111",method = RequestMethod.GET)
  2. @ResponseBody
  3. public ResultBean error111(){
  4. service.test();
  5. // int i = 1/0;
  6. return null;
  7. }
  8. @ExceptionHandler(RuntimeException.class)
  9. @ResponseBody
  10. public String error3(){
  11. return "run time exception";
  12. }
  13. @org.springframework.stereotype.Service
  14. public class Service {
  15. public void test(){
  16. int i = 1/0;
  17. }
  18. }
  • @ControllerAdvice + @ExceptionHandler

使用@ControllerAdvice 和@ExceptionHandler  可以全局控制异常,使业务逻辑和异常处理分隔开。


  
  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3. @ExceptionHandler(MyException.class)
  4. @ResponseBody
  5. public ResultBean handleMyException(MyException e){
  6. System.out.println("handleMyException....");
  7. return new ResultBean(e.getErrorEnum().getCode(),e.getErrorEnum().getMsg());
  8. }
  9. }
  10. public class MyException extends RuntimeException {
  11. private ErrorEnum errorEnum;
  12. public MyException(ErrorEnum errorEnum){
  13. this.errorEnum = errorEnum;
  14. }
  15. public ErrorEnum getErrorEnum() {
  16. return errorEnum;
  17. }
  18. }
  19. public enum ErrorEnum {
  20. SystemError("999","系统异常,请联系管理员"),
  21. MyError1("001","自定义异常1"),
  22. MyError2("002","自定义异常2"),
  23. MyError3("003","自定义异常3");
  24. private String code;
  25. private String msg;
  26. ErrorEnum(String code,String msg){
  27. this.code = code;
  28. this.msg = msg;
  29. }
  30. public String getCode() {
  31. return code;
  32. }
  33. public void setCode(String code) {
  34. this.code = code;
  35. }
  36. public String getMsg() {
  37. return msg;
  38. }
  39. public void setMsg(String msg) {
  40. this.msg = msg;
  41. }
  42. }
  43. @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
  44. public class ResultBean <T>{
  45. private final String SUCCESSCODE = "000";
  46. private final String SUCCESSMSG = "请求成功";
  47. /**
  48. *999 : 请求失败 (系统异常:这时候具体问题原因要去看日志)
  49. *000 : 请求成功
  50. *
  51. *001 : 自定义异常1,用户一眼就能看出问题在哪
  52. *002 : 自定义异常2,用户一眼就能看出问题在哪
  53. *003 : 自定义异常3,用户一眼就能看出问题在哪
  54. *
  55. *
  56. *
  57. */
  58. public String code;
  59. public String message;
  60. public T data;
  61. public ResultBean(){
  62. this.code = SUCCESSCODE;
  63. this.message = SUCCESSMSG;
  64. }
  65. public ResultBean(String code, String message) {
  66. this.code = code;
  67. this.message = message;
  68. }
  69. public ResultBean(T data) {
  70. this();
  71. this.data = data;
  72. }
  73. }

实现 HandlerExceptionResolver 接口


  
  1. @Component
  2. public class MyException implements HandlerExceptionResolver{
  3. /**
  4. * TODO 简单描述该方法的实现功能(可选).
  5. * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
  6. */
  7. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
  8. Exception ex) {
  9. System.out.println("This is exception handler method!");
  10. return null;
  11. }
  12. }

优先级
既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:

当发生异常的时候,SpringMVC会如下处理:

(1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver

(2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常

(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图

(4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图

(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,就看有没有全局ControllerAdvice提供的全局异常处理器,如果没有那么该异常就会被抛出来。

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/104226387

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。