有時候,你會想把捕獲到的異常再次拋出。這種狀況一般發生在 Error 或 RuntimeException 被捕獲的時候,你 沒想捕獲它們,可是聲明捕獲 Throwable 和 Exception 的時候,也包括了了 Error 或 RuntimeException。G uava 提供了若干方法,來判斷異常類型而且從新傳播異常。例如:java
try { someMethodThatCouldThrowAnything(); } catch (IKnowWhatToDoWithThisException e) { handle(e); } catch (Throwable t) { Throwables.propagateIfInstanceOf(t, IOException.class); Throwables.propagateIfInstanceOf(t, SQLException.class); throw Throwables.propagate(t); }
全部這些方法都會本身決定是否要拋出異常,但也能直接拋出方法返回的結果——例如,throw Throwables.pro pagate(t);—— 這樣能夠向編譯器聲明這裏必定會拋出異常。編碼
傳遞異常的經常使用方法:code
可是,以上四個方法所有停用了,因此對異常傳播就不在繼續深刻了解了。對象
Guava 提供了以下三個有用的方法,讓研究異常的緣由鏈變得稍微簡便了,這三個方法的簽名是不言自明的:繼承
// 返回一個最裏面的throwable對象,,第一個throwable將會在錯誤或異常被發現時進入處理鏈上下文 Throwable getRootCause(Throwable) // 獲取一個throwable鏈,以list集合的方式,第一個entry在集合中將會拋出跟着他的cause繼承,記錄他這是一個cause鏈快照,他將不會反射到任何隨後的cause鏈中。這個方法是@Beta註釋的。 List<Throwable> getCausalChain(Throwable) //返回一個字符串包含着throwable實例的tostring結果,經過完整的遞歸這個throwable,記錄他,你該不會擦除這個字符串結果,若是你須要編碼這個棧幀,你能夠調用getStackTrace()方法。 String getStackTraceAsString(Throwable)
無遞歸