异常处理经验小结之一:不要直接抛出InvocationTargetException

在最近一段时间的工作中,积累了几点异常处理的经验,怕时间久了就淡忘了,因此写下本文记录下来,一遍日后总结和查看。

1.在通过反射执行方法的时,如Method.invoke(),如果被反射执行的方法体抛出了Exception,这个异常会被包装成InvocationTargetException重新抛出,下面是jdk里面的源码:

Java代码 收藏代码
  1. publicObjectinvoke(Objectobj,Object...args)
  2. ows<spanstyle="color:#ff0000;">IllegalAccessException</span>,IllegalArgumentException,
  3. InvocationTargetException
  4. {
  5. ...........此处省略.....
  6. }

比如反射方法里抛出了NullPointException,则Method.invoke方法抛出的是InvocationTargetException,而不是NullPointException,见下面的例子,此处抛出的就是InvocationTargetException。

但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:

Java代码 收藏代码
  1. publicclassInvokeException{
  2. @SuppressWarnings("null")
  3. publicvoidtestException(){
  4. StringnullString=null;
  5. nullString.toString();
  6. }
  7. publicstaticvoidmain(String[]args)throwsThrowable{
  8. //TODOAuto-generatedmethodstub
  9. try{
  10. InvokeExceptioninvokeException=newInvokeException();
  11. Methodmethod=invokeException.getClass().getMethod("testException");
  12. method.invoke(invokeException);
  13. }catch(Exceptione){
  14. if(einstanceofInvocationTargetException){
  15. throw((InvocationTargetException)e).getTargetException();
  16. }else{
  17. //doXXX()
  18. }
  19. }
  20. }
  21. }

下一篇讲介绍如何利用Spring的aop来把程序中的check exception转化成自定义的uncheck exception.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值