【发布时间】:2013-10-08 00:01:30
【问题描述】:
我知道在 Java 中,如果一个异常被 catch 子句捕获,并且它的 catch 块抛出一个异常,控制将在线程终止之前通过 throw 关联的 finally 块(如果有的话)。然而,这在 C# 中似乎并非如此。
几乎可以在 C# 中反映这种行为,方法是在 try-catch 语句的 try 块内放置一个 try-finally 语句,并带有引发异常的 catch 块,但如果出现以下情况,这将是一个问题,例如, finally 块应该包含处理应该记录异常的 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 块。此外,如果您在 finally 块内的某行添加断点,您会看到它没有被命中。 (我用的是VS2005)。
据我所知,强制控制通过 finally 块的唯一方法是,如果重新抛出的异常由封闭 try 块的 catch 块处理(如果您将上面的代码放在里面另一个 try-catch 语句的 try 块)。
如果异常没有被捕获并被允许终止应用程序,就像我提供的示例代码一样,控制将不会通过 finally 块。
在 Java 中它会。在 C# 中,至少根据我所见,它不会。
【问题讨论】:
-
它们的行为相同(至少如果我正确理解您的情况)。即使 catch 块抛出,关联的 finally 块也会被执行。如果您提供示例代码,您的问题会更清楚。
标签: c# java exception try-catch-finally