Java 如何使用Google Guava中的Throwables.PropagativeInstanceof()?
Java 如何使用Google Guava中的Throwables.PropagativeInstanceof()?,java,guava,Java,Guava,它不是很具体。一个真正的程序会是什么样子?我真的不明白这些方法的目的,propagate(),propagateifmably()。何时使用它们?这些方法的目的是提供一种方便的方法来处理已检查的异常 public String getCacheValue(String key) throws SQLException{ try{ return cache.get(key); }catch(ExecutedException ex){ Throwables.pr
它不是很具体。一个真正的程序会是什么样子?我真的不明白这些方法的目的,
propagate()
,propagateifmably()
。何时使用它们?这些方法的目的是提供一种方便的方法来处理已检查的异常
public String getCacheValue(String key) throws SQLException{
try{
return cache.get(key);
}catch(ExecutedException ex){
Throwables.propagateIfInstanceOf(ex.getCause(), SQLException.class);
Throwables.propagate(ex);
}
}
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);
}
}
另请参见:
cache.get()
将抛出这些异常(可能特定于LoadingCache,但如果值为misisng,则缓存将尝试加载一个可以抛出选中异常的值),则可以使用这里的Throwables.propagatifiinstanceof
为要处理的调用方法抛出特定异常
您编写的方法的第二个版本不等效。。。您需要再添加两个
catch
块来重新显示异常。。。一个用于运行时异常
,一个用于错误
Throwables.propagate
仅将Throwables包装在RuntimeException
中,前提是它还不是未检查的异常。我仍然不会取消它。如果我想传播异常,为什么还要捕获它?我可以做:public void doSomething()抛出IOException,SQLException{try{somemethodthattowanything();}catch(Iknowwhattowiththis exception e){handle(e);}}。这不是一个真实的例子…@Jeny:You can't do do is'somemethodthat couldthrowanything()`可以抛出一些选中的异常,而不是IOException
和SQLException
。是的,然后我们将其包装在运行时异常中,而不是按原样。这是一个不同的用例,完全依赖于Throwables.propagate(t),但它不能解释没有这种行为的场景。还是我们总是用propagate()结束块?整个想法是不是只是把我们能做的一切都重新扔到原处,把剩下的都扔到垃圾堆里,什么都不扔?然后我开始理解…你不必检查你的可丢弃项是一个特定的已检查异常、一个运行时异常还是一个错误。它防止了过多的一次性封装。不常见的情况是,会出现长达数公里的包装运行时异常,这会导致很长的堆栈跟踪。最后看到最后一个有价值。
public String getCacheValue(String key) throws SQLException{
try{
return cache.get(key);
}catch(ExecutedException ex){
Throwables.propagateIfInstanceOf(ex.getCause(), SQLException.class);
Throwables.propagate(ex);
}
}