我知道在Java中,如果catch子句捕获异常并且其catch block 抛出异常,则控制将在线程终止之前传递抛出关联的finally block (如果有)。然而,在 C# 中情况似乎并非如此。
在 C# 中,通过将 try-finally 语句放入带有引发异常的 catch block 的 try-catch 语句的 try block 中,几乎可以反射(reflect)此行为,但这将是一个问题,例如,finally block 应该包含处理应该记录异常的 Stream Writer 的代码。
是否有一种干净的方法可以在 C# 中实现类似 java 的 try-catch-finally 异常处理行为?
以下是所请求示例代码的更新:
StreamWriter writer = new StreamWriter("C:\\log.txt");
try
{
throw new Exception();
}
catch (Exception e)
{
writer.WriteLine(e.Message);
throw e;
}
finally
{
if (writer != null)
{
writer.Dispose();
}
}
将该代码添加到控制台应用程序,运行它,让重新引发的异常不被处理,尝试删除 C:\log.txt。您将无法这样做,因为控制从未通过finally block 。另外,如果您在 finally block 内的某行添加断点,您将看到它不会被命中。 (我使用的是VS2005)。
据我所知,强制控制通过finally block 的唯一方法是如果重新抛出的异常由封闭的try block 的catch block 处理(如果您将上面的代码放在里面)另一个 try-catch 语句的 try block )。
如果未捕获异常并允许终止应用程序(如我提供的示例代码中所示),则控制将不会通过finally block 。
在 Java 中是这样。在 C# 中,至少根据我所看到的,不会。
最佳答案
不,这是不正确的。 C# 将始终执行 finally
block ,即使在 catch
block 抛出/重新抛出异常之后也是如此。请参阅When is finally run if you throw an exception from the catch block? .
关于c# - 在 C# 中,如果关联的 catch block 引发异常,是否可以强制控制通过 finally block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19236868/