我有一种情况,无论发生什么情况,我都希望执行某些代码,但我还需要将异常传递到堆栈上以便稍后处理。是否如下:
try
{
// code
}
finally
{
// code that must run
}
会忽略任何异常,还是会将它们传递出去?我的测试似乎表明它们仍然可以通过,但我想确定我没有发疯。
编辑:我的问题不是关于最终何时以及是否会执行,而是关于异常是否仍会向上抛出,但现在已经回答了。
我有一种情况,无论发生什么情况,我都希望执行某些代码,但我还需要将异常传递到堆栈上以便稍后处理。是否如下:
try
{
// code
}
finally
{
// code that must run
}
会忽略任何异常,还是会将它们传递出去?我的测试似乎表明它们仍然可以通过,但我想确定我没有发疯。
编辑:我的问题不是关于最终何时以及是否会执行,而是关于异常是否仍会向上抛出,但现在已经回答了。
正如您所说,finally
代码将始终运行,并且异常将向上传递。这几乎就是关键try/finally
- 让一些代码始终运行,即使抛出异常也是如此。
编辑:对于任何提供try/finally
构造的语言都是如此,但对于某些语言有一些警告,正如亚当在他的评论中指出的那样,萨姆在他的回答中指出。
这是一个测试类,显示(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;
}
}
}
假设这是 C#,finally 将始终运行,除非您收到StackOverflowException或ExecutingEngineException
此外,像 ThreadAbortException 这样的异步异常可能会中断 finally 块的流程,导致它部分执行。
查看相关问题:
如果这是 C#:
这里的答案是正确的,finally 运行并且异常被“传递”。但是为了说明弄清楚它是多么容易:
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 块。