如何使用来自Google Guava的Throwtables.propagateIfInstanceOf()?

2022-09-04 02:17:53

javadoc 示例

  try {
    someMethodThatCouldThrowAnything();
  } catch (IKnowWhatToDoWithThisException e) {
    handle(e);
  } catch (Throwable t) {
    Throwables.propagateIfInstanceOf(t, IOException.class);
    Throwables.propagateIfInstanceOf(t, SQLException.class);
    throw Throwables.propagate(t);
  }

不是很具体。一个真正的程序会是什么样子?我真的不明白Shrewables.propagateIfInstanceOf(Throwable, Class), , .我什么时候使用它们?propagate()propagateIfPossible()


答案 1

这些方法的目的是提供一种方便的方法来处理已检查的异常。

Throwables.propagate()是将 retrowing 选中的异常包装成未选中的异常的常见习语的简写(以避免在方法的子句中声明它)。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);
    }  
}

另请参阅:


答案 2

我已经浏览了番石榴投掷器的文档,但我没有发现它们真的很有用。使用 throw new RuntimeException(e) 比 Throwables.propagate() 更易于理解,在您希望引发一个未经检查的异常来包装已检查的异常的情况下。


推荐