在Java8中寻找内置函数来忽略异常

时间:2017-03-08 23:51:26

标签: java exception lambda java-8

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

最初我这样做是这样的:

// 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时,我注意到in this answer我可以像这样重写我的代码:

// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();

// WHEN
ingoreExceptions(() -> coffee.spill());


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

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

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

@FunctionalInterface public interface RunnableExc { void run() throws Exception; }

问题:

  • Java8是否附带了我可以直接使用的类似内容?
  • 哪些实用程序库有这样的东西?

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

1 个答案:

答案 0 :(得分:6)

使用内置功能的最简单方法,我能想到的是

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

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

如果spill()已声明为void,则不能将Callable简单地用作new FutureTask<>(() -> { coffee.spill(); return null; }).run(); ,因此您必须使用

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

但值得商榷的是,基于lambda表达式的解决方案是否可以是原始代码的简化,由于换行符而看起来不那么简洁:

Authorization