有时候,当你捕获一个异常时,你可能想将它抛到下一个try/catch
块。这样情况很常见,例如在出现RuntimeException
和Error
的情况下,不需要try/catch
块,你也不想捕获它们,但是它们仍然被try/catch
块捕获。
Guava 提供了一些工具类来简化异常传播。例如:
try {
someMethodThatCouldThrowAnything();
} catch (IKnowWhatToDoWithThisException e) {
handle(e);
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, IOException.class);
Throwables.propagateIfInstanceOf(t, SQLException.class);
throw Throwables.propagate(t);
}
每一个方法都抛了异常,而抛出的结果,例如Throwables.propagate(t)
,可以证明编辑器抛出了一个很有用的异常。
下面是 Guava 提供的异常传播方法的摘要:
方法签名 | 解释 |
---|---|
RuntimeException propagate(Throwable) | 通过RuntimeException或者Error进行异常传播,或者将异常包装进RuntimeException,可以保证异常的传播性。由于其返回类型是一个RuntimeException,所以你可以通过throw Throwables.propagate(t)抛出异常,而且 Java 可以识别这样的语句,并保证抛出一个异常。 |
void propagateIfInstanceOf(Throwable, Class) throws X | 当且仅当异常实例为X的时候,进行异常传播。 |
void propagateIfPossible(Throwable) | 当出现RuntimeException或者Error时,抛出throwable |
void propagateIfPossible(Throwable) | 当出现RuntimeException、Error或者X时,抛出throwable |
Throwables.propagate
的使用详见「为什么我们不赞成使用 Throwables.propagate」
Guava 提供了三个有用的方法,使得异常链的研究更加简单,通过这三个方法的签名就可以窥知一二:
Throwable getRootCause(Throwable) |
---|
List<Throwable> getCausalChain(Throwable) |
String getStackTraceAsString(Throwable) |
翻译声明:本文翻译自 GitHub,Google Guava - ThrowablesExplained.