我知道在Java中,如果一个异常被catch子句捕获,并且它的catch块引发异常,控制会在线程终止之前传递相关的finally块(如果有的话)。但是,这在C#中并不是这种情况。如果关联的catch块引发异常,是否可以强制控制通过finally块?
在C#中几乎可以反映这种行为是通过将try-catch语句放入try-catch语句的try块中,并使用catch块引发异常,但这会是一个问题,如果例如,finally块应该包含处理应该记录异常的Stream Writer的代码。
有没有一种干净的方式来实现类似于java的try-catch-finally异常处理行为在C#中?
下面是与所请求的样本代码的更新:
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块也会被执行。如果你提供了示例代码,你的问题会更加清晰。 –