异常处理经验小结之一:不要直接抛出InvocationTargetException
2015-09-08 19:42
369 查看
在最近一段时间的工作中,积累了几点异常处理的经验,怕时间久了就淡忘了,因此写下本文记录下来,一遍日后总结和查看。
1.在通过反射执行方法的时,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出,下面是jdk里面的源码:
比如反射方法里抛出了NullPointException,则Method.invoke方法抛出的是InvocationTargetException,而不是NullPointException,见下面的例子,此处抛出的就是InvocationTargetException。
![](http://static.oschina.net/uploads/img/201509/08194228_e1Sj.jpg)
但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:
下一篇讲介绍如何利用Spring的aop来把程序中的check exception转化成自定义的uncheck exception.
1.在通过反射执行方法的时,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出,下面是jdk里面的源码:
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { ...........此处省略..... }
比如反射方法里抛出了NullPointException,则Method.invoke方法抛出的是InvocationTargetException,而不是NullPointException,见下面的例子,此处抛出的就是InvocationTargetException。
![](http://static.oschina.net/uploads/img/201509/08194228_e1Sj.jpg)
但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:
public class InvokeException { @SuppressWarnings("null") public void testException(){ String nullString = null; nullString.toString(); } public static void main(String[] args) throws Throwable { // TODO Auto-generated method stub try{ InvokeException invokeException = new InvokeException(); Method method = invokeException.getClass().getMethod("testException"); method.invoke(invokeException); }catch (Exception e) { if(e instanceof InvocationTargetException){ throw ((InvocationTargetException) e).getTargetException(); }else{ //doXXX() } } } }
下一篇讲介绍如何利用Spring的aop来把程序中的check exception转化成自定义的uncheck exception.
相关文章推荐
- hdu 1575 Tr A
- IOS_UI_Block 传值
- Centos7 开放端口
- Android中线程的基本用法
- Centos7 开放端口
- <Chapter 2>2-1.安装SDK
- 数据库原理课后习题答案
- hdu1403 后缀数组
- markdown初体验--项目3
- 自己整理的一些Android Studio 常用快捷键
- 第2周-求圆的面积
- TestLin实验提高篇
- JUnit---Java单元测试必备工具
- fragment重叠问题(add hide show方式)
- GSview 5.0可用注册码:55555-24868
- POJ 2447 RSA(大整数分解质因数+逆元)
- git hooks
- 关于运动
- iOS开发-Day33-xml解析
- [AngularJS + Webpack] Requiring CSS & Preprocessors