并行流中不一致的异常详细信息

dlh*_*all 5 java java-8 assertj java-stream

在大多数情况下,并行流中引发的异常不会具有其所有属性。

例如:

@Test
public void test() {
    assertThatThrownBy(() -> Stream.of("1", "2", "asdf").parallel().forEach(Integer::parseInt))
            .asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
            .extracting("detailMessage")
            .isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)

大多数情况下这会失败,而这是:

@Test
public void test() {
    assertThatThrownBy(() -> Stream.of("1", "2", "asdf").forEach(Integer::parseInt))
            .asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
            .extracting("detailMessage")
            .isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)

成功100%的时间。

另一件事是,当消息不存在时,它将出现在异常原因中。例如:

@Test
public void test() {
    assertThatThrownBy(() -> Stream.of("1", "2", "asdf").parallel().forEach(Integer::parseInt))
            .asInstanceOf(InstanceOfAssertFactories.type(NumberFormatException.class))
            .extracting("cause.detailMessage")
            .isEqualTo("For input string: \"asdf\"");
}
Run Code Online (Sandbox Code Playgroud)

关于如何使并行流抛出精确和异常而不是某种嵌套怪物的任何想法?

sel*_*rer 0

也许您正在接收一个由另一种类型的异常包装的异常,该异常parallel()会抛出更多信息,而您要查找的实际异常位于getCause()或中getSupperessed()

外部异常具有的附加信息可以是流中通过异常的项目数量(例如“3 中的 1”)或类似的信息。