我已经编写了一些自动化测试,我使用的语法如 -
try {
// Test case steps and validations
} finally {
// Clean up related to test
}
注意:由于我的测试不期望例外,因此没有catch
阻止。
如果try
以及finally
阻止测试失败,则只有finally
的失败才会在控制台上返回,而不是try
。这里的简单示例(此处使用TestNG进行断言) -
try {
Assert.assertEquals(true, false, "Boolean values did not match");
} finally {
Assert.assertEquals(100, 10, "Integer values did not match");
}
在这种情况下,只返回最终失败的详细信息。
这无法确定查看控制台的实际测试失败。
我想了解为什么Java不会在控制台上返回两个故障详细信息,这可以帮助用户在初看时找出故障原因。
答案 0 :(得分:4)
抛出异常可以观察到同样的事情:
try {
throw new RuntimeException("Message 1");
} finally {
throw new RuntimeException("Message 2");
}
此处仅打印Message 2
:
Exception in thread "main" java.lang.RuntimeException: Message 2
这是因为当finally
抛出异常时,try
中的任何例外都会被丢弃并被遗忘":
JLS第14.20.2节
如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则 然后执行finally块。然后有一个选择:
如果finally块正常完成,则由于抛出值V,try语句突然完成。
如果finally块因为S而突然完成,则try语句突然完成,原因是S(和值的抛出 V被丢弃并被遗忘)。
答案 1 :(得分:1)
因为幕后Assert.assertEquals()
使用Assert.fail()
引发AssertionError
来表示错误。
finally
阻止中的异常将替换并丢弃try
阻止initHighlightingOnLoad()
阻止的异常。
答案 2 :(得分:1)
这是因为从finally
块抛出的新异常替换了从try
块抛出的异常,如Java语言规范部分{{3 }}:
如果
try
块的执行由于值throw
的{{1}}突然完成,则可以选择:[...]
如果
V
块因为finally
突然完成,那么S
语句突然完成,原因为try
(以及S
值throw
被丢弃并被遗忘)。
由于V
块甚至不知道原始异常,因此它无法对此做任何事情。
但是,如果你finally
原始异常,可以将其包含为压缩异常(Java 7+),但它有点复杂:
catch