具有多个内部异常并使用流

时间:2018-03-14 05:50:38

标签: java exception-handling java-stream throwable

如何处理有多个问题要报告的文件的多异常异常。

我有一个多处理步骤的情况,可以发生不同的异常(例如,它们将在稍后异步)。我正在使用(可能是快速失败的反模式)异常列表,然后一旦完成并检查异常

我有自己的自定义例外类别(对于每个异步任务)(扩展Exception类)但实现了一个接口,以获得其他信息,如特定于消息的键值对

示例实施

List<Files> Folder;
//Now processed into below folders
List<Files> EnglishFolder;
List<Files> KoreanFolder;
List<Files> SpanishFolder;

//Now each task accumulates own exceptions.

EnglishException extends Exception implements InfoMapping 
{    
   private EnumMap<CUSTOMENUM,STRING> info;    
   EnglishException(String message){super(message);} 
   EnglishException(String message, Exception why){super(message);}    
   public void addInfo(CUSTOMENUM key,String value){info.add(key,value} 
}

我的问题是,如果我知道在每个任务中创建这些异常对象的问题,但我不会抛弃它们。但如果有一般例外我只是抓住它们并将其添加为

List<EnglishException> englishErrors;
//blah blah
englishErrors.add(new EnglishException("I found this error"));
//if generic exception in catch
englishErrors.add(new EnglishException("Unknown English error",e));
//returns without throwing exception

现在我需要同步所有任务

将所有异常整齐地打包到XML文件中

所以我需要支持一个支持Exceptions class列表的异常类,只有Exception(String message, Throwable cause)只支持单个内部异常。

2个问题:

  1. 我应该实现另一个接口并有一个特殊的例外 实现该类并将innerException重写为列表的类?要么 我在java中缺少支持多内部异常的东西吗?或任何 这样做的其他声音练习?
  2. 作为流的新手,我可以使上述逻辑更具可读性/简单性 (我非常天真的Java 8,只是阅读所以请原谅我,如果它没有 任何意义)。不想得到答案,可能只是指向中的内容 溪流寻找实现这一目标。

    Streams.Of(englishExceptionList,spanishExceptionList)

    .reduce(parentException)

    .ifAny(throw parentException)

1 个答案:

答案 0 :(得分:1)

你可以使用Throwable.addSuppressed(Throwable)来记录任意数量的throwable(后来通过getSuppressed()检索),并且在语义上比将其他throwable记录为“cause”更合适。 / p>

由于这是对其中一个throwable的一种修改,reduce不是正确的操作(并且它不会在并行操作中提供预期的结果)。

这看起来不像需要对大量元素进行优化的操作,因此,最好的解决方案是直接将所有元素收集到List并使用

if(!listOfAllExceptions.isEmpty()) {
    Throwable t = listOfAllExceptions.get(0);
    listOfAllExceptions.subList(1, listOfAllExceptions.size()).forEach(t::addSuppressed);
    throw t;
}

需要将t的类型调整为未经检查或声明的异常