Mat*_*t H 10 exception-handling exception finally
我有一种情况,我希望无论发生什么事情都要执行某些代码,但我需要将异常传递到堆栈中以便稍后处理.以下是:
try
{
// code
}
finally
{
// code that must run
}
Run Code Online (Sandbox Code Playgroud)
只是忽略任何异常,还是会将它们传递给它们?我的测试似乎表明他们仍然被传递,但我想确定我不是疯了.
编辑:我的问题不是关于何时以及最终是否会执行,而是关于异常是否仍然被抛出,但现在已经得到了回答.
Ric*_*dle 17
该finally代码将始终运行和异常会向上传递,就像你说的.这几乎就是try/finally- 有一些代码总是会运行,即使抛出异常也是如此.
编辑:对于提供try/finally构造的任何语言都是如此,但是对于某些语言有一些警告,正如Adam在他的评论中指出的那样,Sam在他的回答中指出了这一点.
这是一个测试类,它显示(1)最终运行,无论是否抛出异常; (2)异常传递给调用者.
public class FinallyTest extends TestCase {
private boolean finallyWasRun = false;
public void testFinallyRunsInNormalCase() throws Exception {
assertFalse(finallyWasRun);
f(false);
assertTrue(finallyWasRun);
}
public void testFinallyRunsAndForwardsException() throws Exception {
assertFalse(finallyWasRun);
try {
f(true);
fail("expected an exception");
} catch (Exception e) {
assertTrue(finallyWasRun);
}
}
private void f(boolean withException) throws Exception {
try {
if (withException)
throw new Exception("");
} finally {
finallyWasRun = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)