c# - 在 C# 中,如果关联的 catch block 引发异常,是否可以强制控制通过 finally block ?

标签 c# java exception try-catch-finally

我知道在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/

相关文章:

java - 在 Android 中排列嵌套布局

c# - 缺失数据异常

javascript - 在 javascript/nodejs 中抛出异常真的那么糟糕吗?

c# - 如何将 void 返回扩展方法传递给动态返回扩展方法?

c# - Azure Cosmos DB 添加字符串数组的复合索引

c# - 通过 IP 地址查看驱动器的可用空间

c# - 我们可以为所有方法编写扩展方法吗?

c# - 将剪贴板内容存储到字节数组?

java - Wicket 口 - 双重重定向

java - Logback 文件附加程序不会立即刷新