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.propagateIfInstanceOf(Throwable, Class)
, 传播()
, 传播IfPossible()
。我什么时候使用它们?
最佳答案
这些方法的目的是提供一种方便的方法来处理已检查的异常。
Throwables.propagate()
是将已检查异常包装到未检查异常中的常见用法的简写(以避免在方法的 throws
子句中声明它)。
Throwables.propagateIfInstanceOf()
用于在方法的 throws
子句中声明类型时按原样追溯已检查的异常。
换句话说,有问题的代码
public void doSomething()
throws IOException, SQLException {
try {
someMethodThatCouldThrowAnything();
} catch (IKnowWhatToDoWithThisException e) {
handle(e);
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, IOException.class);
Throwables.propagateIfInstanceOf(t, SQLException.class);
throw Throwables.propagate(t);
}
}
是以下代码的简写:
public void doSomething()
throws IOException, SQLException {
try {
someMethodThatCouldThrowAnything();
} catch (IKnowWhatToDoWithThisException e) {
handle(e);
} catch (SQLException ex) {
throw ex;
} catch (IOException ex) {
throw ex;
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
另请参阅:
关于java - 如何使用 Google Guava 的 Throwables.propagateIfInstanceOf()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090417/