文章目录

  • 1,基本使用方法
  • 2,注解的参数
  • 3,就近原则
  • 4,注解方法的返回值
  • 5,错误的操作

1,基本使用方法

Spring的@ExceptionHandler可以用来统一处理方法抛出的异常,比如这样:

@ExceptionHandler()
public String handleExeption2(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:默认";return resultStr;
}

当我们使用这个@ExceptionHandler注解时,我们需要定义一个异常的处理方法,比如上面的handleExeption2()方法,给这个方法加上@ExceptionHandler注解,这个方法就会处理类中其他方法(被@RequestMapping注解)抛出的异常。

2,注解的参数

@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常,比如这样:

@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:NumberFormatException";return resultStr;
}

此时注解的参数是NumberFormatException.class,表示只有方法抛出NumberFormatException时,才会调用该方法。

3,就近原则

当异常发生时,Spring会选择最接近抛出异常的处理方法。

比如之前提到的NumberFormatException,这个异常有父类RuntimeException,RuntimeException还有父类Exception,如果我们分别定义异常处理方法,@ExceptionHandler分别使用这三个异常作为参数,比如这样:

@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:NumberFormatException";return resultStr;
}@ExceptionHandler()
public String handleExeption2(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:默认";return resultStr;
}@ExceptionHandler(RuntimeException.class)
public String handleExeption3(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:RuntimeException";return resultStr;
}

那么,当代码抛出NumberFormatException时,调用的方法将是注解参数NumberFormatException.class的方法,也就是handleExeption(),而当代码抛出IndexOutOfBoundsException时,调用的方法将是注解参数RuntimeException的方法,也就是handleExeption3()。

4,注解方法的返回值

标识了@ExceptionHandler注解的方法,返回值类型和标识了@RequestMapping的方法是统一的,可参见@RequestMapping的说明,比如默认返回Spring的ModelAndView对象,也可以返回String,这时的String是ModelAndView的路径,而不是字符串本身。

有些情况下我们会给标识了@RequestMapping的方法添加**@ResponseBody**,比如使用Ajax的场景,直接返回字符串,异常处理类也可以如此操作,添加@ResponseBody注解后,可以直接返回字符串,比如这样:

@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:NumberFormatException";return resultStr;
}

这样的操作可以在执行完方法后直接返回字符串本身。

5,错误的操作

使用@ExceptionHandler时尽量不要使用相同的注解参数

如果我们定义两个处理相同异常的处理方法:

@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:NumberFormatException";return resultStr;
}@ExceptionHandler(NumberFormatException.class)
@ResponseBody
public String handleExeption2(Exception ex) {System.out.println("抛异常了:" + ex);ex.printStackTrace();String resultStr = "异常:默认";return resultStr;
}

两个方法都处理NumberFormatException,这种定义方式编译可以通过,而当NumberFormatException真正被抛出时,Spring会给我们报错:

java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class java.lang.NumberFormatException]: {public java.lang.String TestController.handleExeption(java.lang.Exception), public java.lang.String TestController.handleExeption2(java.lang.Exception)}at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.addExceptionMapping(ExceptionHandlerMethodResolver.java:102) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.<init>(ExceptionHandlerMethodResolver.java:66) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]

Spring的@ExceptionHandler注解使用方法相关推荐

  1. shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决

    shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决 from :http://blog.csdn.net/babys/article/ ...

  2. Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转)

    Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) 参考文章: (1)Spring - 同一个类中的方法互相调用,注解失效问题的分析和解决(转) (2)https://www. ...

  3. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    Spring boot异常统一处理方法:@ControllerAdvice注解的使用.全局异常捕获.自定义异常捕获 参考文章: (1)Spring boot异常统一处理方法:@ControllerAd ...

  4. Spring注解使用方法

    Spring框架从创建伊始就致力于为复杂问题提供强大的.非侵入性的解决方案.Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop.con ...

  5. Spring框架bean的注解管理方法之一 使用注解生成对象

    首先在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.baidu.com/s/1qXLH ...

  6. spring aop获取目标对象的方法对象(包括方法上的注解)(转)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  7. Spring框架最终注解标签注入方法

    使用注解装配bean 使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性. Spring默认禁用注解装配,最简单的启用 ...

  8. Spring之AOP系列--将方法上的注解做为切点(用@Around)

    原文网址:Spring之AOP系列--将方法上的注解做为切点(用@Around)_IT利刃出鞘的博客-CSDN博客 简介 说明         本文介绍Spring(SpringBoot)的AOP的用 ...

  9. spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效

    title: "spring同一个类中,一个方法调用另外一个注解(@Transactional)方法时,注解失效" url: "https://wsk1103.githu ...

最新文章

  1. mysql注解批量添加mybatis_Mybatis通过注解方式实现批量插入数据库 及 常见的坑
  2. linux c 控制cpu占用率
  3. mysql时间与字符串相互转换
  4. python中event_Python Event实现线程通信
  5. SQLAlchemy 中文文档翻译计划
  6. 编译好的编译ffmpeg又出错:更改输出目录产生各种古怪错误
  7. VS2019离线安装包制作
  8. 【读PPT】管中窥豹:用大数据洞察“用户画像”的秘密!
  9. linux离线安装yum源
  10. MySQL数据库面试题(2020最新版)
  11. Android平板软件推荐,新人看过来 安卓平板装机必备软件推荐
  12. [原创]我眼中的乔布斯
  13. Kali exiftool图片信息工具
  14. 操作系统文件保护及文件共享
  15. [Android1.5]标签TabHost图片文字覆盖的问题
  16. 前端项目实战59-new URLSearchParams
  17. 系统重装计算机硬件不兼容,升级Win10系统出现兼容性报告详细解答
  18. h5的第一天 做的自定义调色器
  19. iperf的ios版本;无线局域网测速
  20. 2016年全国高中数学联赛加试T3解答

热门文章

  1. aio nio aio_AIO的完整形式是什么?
  2. scala中def_def关键字以及Scala中的示例
  3. Java OutputStreamWriter close()方法与示例
  4. linux开源文档管理系统_Linux中的系统管理员问题 免费和开源软件
  5. 如何打印出给定尺寸的方格_打印给定号码的表格| 8085微处理器
  6. java中map的遍历方法_Java中Map的三种遍历方式
  7. 我想成为计算机专业第一,我对计算机专业学生的忠告。
  8. python点线图_Python | 点线图
  9. 数组copyWithin()方法以及JavaScript中的示例
  10. Spring中的重试功能!嗯,有点东西