在Java8中寻找内置功能以忽略异常



我有一个集成测试,其中我称为的一种方法有时会引发异常。我想忽略例外,但我想以最优雅的方式做到这一点。

最初我这样做:

// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();
// WHEN
try{
    coffee.spill()
}catch(Exception e){
    // Ignore this exception.  I don't care what coffee.spill 
    // does as long as it doesn't corrupt my newspaper
}
// THEN
Assert.assertTrue(newspaper.isReadable);

在浏览stackoverflow时,我在答案中注意到我可以这样重写我的代码:

// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();
// WHEN
ingoreExceptions(() -> coffee.spill());

// THEN
Assert.assertTrue(newspaper.isReadable);

但是,我需要提供自己的{{nighoringExc}}的实现:

public static void ingoreExceptions(RunnableExc r) {
  try { r.run(); } catch (Exception e) { }
}
@FunctionalInterface public interface RunnableExc { void run() throws Exception; }

问题:

  • java8是否可以使用类似的东西来运输?
  • 哪些公用事业库有这样的东西?

这似乎是一条足够的代码,我应该能够使用别人的代码。不想重新发明轮子。

使用内置功能的最简单方法,我可以想出

new FutureTask<>(() -> coffee.spill()).run();

FutureTask不忽略异常,而是捕获并记录它们,因此您仍然决定不查询结果。

如果spill()已声明为void,则不能用作Callable,因此您必须使用

new FutureTask<>(() -> { coffee.spill(); return null; }).run();

但值得商bat,是否可以基于LAMBDA表达的解决方案是您原始代码的简化,由于线路破裂,它看起来只不及简洁:

try{ coffee.spill(); } catch(Exception e){}
ignoreExceptions(() -> coffee.spill());// saved four chars...

最新更新