如何处理具有多个要报告问题的文件上的“多例外”例外。

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

我有自己的自定义异常类别(对于每个异步任务)(扩展了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文件中

因此,我需要支持1个支持Exceptions class列表的异常类,而该Exception(String message, Throwable cause)仅支持单个内部异常。

2个问题:


我应该实现另一个接口并有一个特殊的例外
实现该类并重写innerException以列出的类?要么
我在Java中缺少支持多内部异常的东西吗?或任何
其他合理的做法吗?
作为流的新手,我可以使上述逻辑更具可读性/简单性,例如
(我对Java 8非常幼稚,只是阅读所以请原谅我
任何意义)。不想获得答案,可能只是指向
流来寻求实现这一目标。

Streams.Of(englishExceptionList,spanishExceptionList)

.reduce(parentException)

.ifAny(throw parentException)

最佳答案

您可以使用Throwable.addSuppressed(Throwable)来记录任意数量的可抛出对象(并随后通过getSuppressed()进行检索),并且在语义上比将其他可抛出对象记录为“原因”更好。

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

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

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


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

10-06 12:41
查看更多