我有一种情况,我希望无论发生什么情况都要执行某些代码,但我需要将异常传递到堆栈中以便稍后处理。如下:
try
{
// code
}
finally
{
// code that must run
}
只是忽略任何异常,还是会将它们传递给它们?我的测试似乎表明他们仍然被传递,但我想确定我不是疯了。
编辑:我的问题不是关于何时以及最终是否会执行,而是关于异常是否仍然被抛出,但现在已经得到了解答。
答案 0 :(得分:17)
如您所说,finally
代码将始终运行,异常将被传递。这就是try/finally
的重点 - 让一些代码始终运行,即使抛出异常也是如此。
编辑:对于提供try/finally
构造的任何语言都是如此,但对于某些语言有一些警告,正如Adam在评论中指出的那样,Sam在他的回答中指出
答案 1 :(得分:9)
这是一个测试类,它显示(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;
}
}
}
答案 2 :(得分:3)
假设这是C#,除非得到StackOverflowException或ExecutingEngineException
,否则最终会一直运行此外,ThreadAbortException之类的异步异常可以中断finally块的流,从而导致它部分执行。
参见相关问题:
答案 3 :(得分:2)
如果这是C#:
这里的答案是正确的,最终运行并且异常被“传递”。但要说明解决它是多么容易:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
static void Main(string[] args)
{
try
{
throw new Exception("testing");
}
finally
{
Console.WriteLine("Finally");
}
}
}
运行这个简单的小型控制台应用程序时,抛出异常,然后执行finally块。