具有多个内部异常并使用流的异常
Exceptions with more than one inner exception and using streams
我如何处理一个文件的多异常异常并报告多个问题。
我有一个多处理步骤的情况,其中可能会发生不同的异常(例如,它们稍后将被异步化)。我正在使用(可能是快速失败的反模式)异常列表,然后一旦它们完成并检查异常
我有自己的自定义异常类别(对于每个异步任务)(扩展 Exception
class)但实现了一个接口以包含附加信息,例如特定于消息的键值对
实施示例
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 个异常 class 支持列表 Exceptions class
只有这个 Exception(String message, Throwable cause)
只支持单个内部异常。
2 个问题:
- 我是否应该实现另一个接口并有一个特殊的例外
class 实现它并将 innerException 覆盖为列表?要么
我是否在 java 中遗漏了支持多重内部异常的内容?或任何
这样做的其他合理做法?
作为流的新手,我可以让上面的逻辑更像 readable/simple
(对java8很幼稚,只是在看书,如有不妥请见谅
有任何意义)。不希望得到答案,可能只是指向其中的内容
要寻找实现此目的的流。
Streams.Of(englishExceptionList,spanishExceptionList)
.reduce(parentException)
.ifAny(throw parentException)
您可以使用 Throwable.addSuppressed(Throwable)
which allows an arbitrary number of throwables to be recorded (and later retrieved via getSuppressed()
) 并且在语义上也比将其他可抛出的对象记录为“原因”更合适。
因为这是对其中一个 throwable 的一种修改,reduce
不是正确的操作(并且它不会在并行操作中提供预期的结果)。
这看起来不像是需要对大量元素进行优化的操作,因此,最好的解决方案是 straight-forwardly 将所有元素收集到 List
中并使用
if(!listOfAllExceptions.isEmpty()) {
Throwable t = listOfAllExceptions.get(0);
listOfAllExceptions.subList(1, listOfAllExceptions.size()).forEach(t::addSuppressed);
throw t;
}
t
的类型需要调整为unchecked or declared exception.
我如何处理一个文件的多异常异常并报告多个问题。
我有一个多处理步骤的情况,其中可能会发生不同的异常(例如,它们稍后将被异步化)。我正在使用(可能是快速失败的反模式)异常列表,然后一旦它们完成并检查异常
我有自己的自定义异常类别(对于每个异步任务)(扩展 Exception
class)但实现了一个接口以包含附加信息,例如特定于消息的键值对
实施示例
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 个异常 class 支持列表 Exceptions class
只有这个 Exception(String message, Throwable cause)
只支持单个内部异常。
2 个问题:
- 我是否应该实现另一个接口并有一个特殊的例外 class 实现它并将 innerException 覆盖为列表?要么 我是否在 java 中遗漏了支持多重内部异常的内容?或任何 这样做的其他合理做法?
作为流的新手,我可以让上面的逻辑更像 readable/simple (对java8很幼稚,只是在看书,如有不妥请见谅 有任何意义)。不希望得到答案,可能只是指向其中的内容 要寻找实现此目的的流。
Streams.Of(englishExceptionList,spanishExceptionList)
.reduce(parentException)
.ifAny(throw parentException)
您可以使用 Throwable.addSuppressed(Throwable)
which allows an arbitrary number of throwables to be recorded (and later retrieved via getSuppressed()
) 并且在语义上也比将其他可抛出的对象记录为“原因”更合适。
因为这是对其中一个 throwable 的一种修改,reduce
不是正确的操作(并且它不会在并行操作中提供预期的结果)。
这看起来不像是需要对大量元素进行优化的操作,因此,最好的解决方案是 straight-forwardly 将所有元素收集到 List
中并使用
if(!listOfAllExceptions.isEmpty()) {
Throwable t = listOfAllExceptions.get(0);
listOfAllExceptions.subList(1, listOfAllExceptions.size()).forEach(t::addSuppressed);
throw t;
}
t
的类型需要调整为unchecked or declared exception.