InvocationTargetException 是一种包装由调用方法或构造方法所抛出异常的受查异常。这个异常并不是Eclipse插件开发特有的,而是标准JDK中的,它定义在 java.lang.reflect包下。在进行Java开发的时候很少会接触到这个异常,不过在进行Eclipse插件开发中则不同,很多API都声明抛出此类异常,因此必须对此异常进行处理。
但是InvocationTargetException太过于宽泛,在trouble shouting的时候,不能给人非常直观的信息,所以在处理反射方法异常的时候,我们需要把这个InvocationTargetException的targetException提取处理,重新抛出,因为这个才是对我们分析程序bug真正有帮助的异常:
一般情况下我们会调用e.getMessage()或者e.printStackTrace();查看错误,但是通过查看InvocationTargetException的源码得InvocationTargetException 并没有覆盖getMessage方法,所以消息当然是空的了。我们需要调用InvocationTargetException 的getTargetException方法得到要被包装的异常,这个异常才是真正我们需要的异常。
Apache Ranger的源码中是如下处理的:
try { m.invoke(null, master) ; logInfo("Execute method name [" + mname + "] in Class [" + cName + "] is successful."); } catch (InvocationTargetException e) { Throwable cause = e ; boolean tableExistsExceptionFound = false ; if (e != null) { Throwable ecause = e.getTargetException() ; if (ecause != null) { cause = ecause ; if (ecause instanceof TableExistsException) { tableExistsExceptionFound = true ; } } }
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/13744.html