为什么finally块在抛出异常时可能不会执行?

qqq*_*qqq 2 c# exception finally try-catch try-finally

很长一段时间,我认为它可以让我释放finally块中的所有资源,并且我认为如果try块中发生异常,那么该块中的资源仍然会被释放finally。但情况似乎并非如此。

我有以下一段代码:

using System;

public sealed class Program
{

    public static void Main()
    {
        try {
            int zero = 0;
            int i = 1/zero;
        } finally {
            Console.WriteLine("divide by zero"); //the line is never called
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从来没有到达打印到控制台的行。这意味着finally在这种情况下,我将无法在块内抛出异常时释放块中的资源try

所以,我相信有两件事:要么我遗漏了什么,要么try+finally组合在 C# 中没有用例。第二个语句是有道理的,因为我将获得与上面的代码和下面的代码产生的相同的功能:

using System;

public sealed class Program
{

    public static void Main()
    {
            int zero = 0;
            int i = 1/zero;

            Console.WriteLine("divide by zero"); //the line is never called
    }
}
Run Code Online (Sandbox Code Playgroud)

但我担心我可能会在这里遗漏一些东西。那么,有人可以确认该组合没有用或证明它没有用吗?

更新

在能够finally在其小提琴中调用块的注释之后,我在 VS Code 中再次检查,但仍然看不到输出。

在此处输入图片说明

AAA*_*ddd 9

你的假设是不正确的(有时)https://dotnetfiddle.net/hjqmOS

try-finally(C# 参考)

通过使用 finally 块,您可以清理在 try 块中分配的任何资源,并且即使在 try 块中发生异常也可以运行代码。通常,finally 块的语句在控制离开 try 语句时运行。控制转移可以作为正常执行、break、continue、goto 或 return 语句的执行,或从 try 语句传播异常的结果而发生。

虽然有些情况下它不运行

在处理的异常中,保证运行关联的 finally 块。但是,如果未处理异常,则 finally 块的执行取决于如何触发异常展开操作。反过来,这取决于您的计算机的设置方式。

这是重要的部分

通常,当未处理的异常结束应用程序时,是否运行 finally 块并不重要。但是,如果您在 finally 块中的语句即使在这种情况下也必须运行,一种解决方案是在 try-finally 语句中添加一个 catch 块。或者,您可以捕获可能在调用堆栈上方的 try-finally 语句的 try 块中抛出的异常。

  • @BrootsWaymb 令人惊讶的是那些讨厌的文档中隐藏着什么:) (3认同)