有时候,你会想把捕获到的异常再次抛出。这种状况一般发生在 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)
无递归