我知道在Java中,如果一个异常被一个catch子句捕获并且它的catch块抛出一个异常,控制将在线程终止之前传递相关的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 块中另一个 try-catch 语句)。
如果异常没有被捕获并被允许终止应用程序,就像我提供的示例代码一样,控制将不会通过 finally 块。
在Java中它会。在 C# 中,至少根据我所见,它不会。