標籤:eth poi tar basic href format tin 分享 src
異常處理經驗小結之一:不要直接拋出InvocationTargetException (轉http://olylakers.iteye.com/blog/1137371)
在最近一段時間的工作中,積累了幾點異常處理的經驗,怕時間久了就淡忘了,因此寫下本文記錄下來,一遍日後總結和查看。
1.在通過反射執行方法的時,如Method.invoke(),如果被反射執行的方法體拋出了Exception,這個異常會被封裝成InvocationTargetException重新拋出,下面是jdk裡面的源碼:
public Object invoke(Object obj, Object... args) throws <span style="color: #ff0000;">IllegalAccessException</span>, IllegalArgumentException, InvocationTargetException { ...........此處省略..... }
比如反射方法裡拋出了NullPointException,則Method.invoke方法拋出的是InvocationTargetException,而不是NullPointException,見下面的例子,此處拋出的就是InvocationTargetException。
但是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(); The Throwable.getCause() method is now the preferred means of obtaining this information. e.getCause() }else{ throw e; } } } }
Java Basic Exception