Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果存在未处理的异常,是否执行finally block?_C#_.net - Fatal编程技术网

C# 如果存在未处理的异常,是否执行finally block?

C# 如果存在未处理的异常,是否执行finally block?,c#,.net,C#,.net,我们知道finally块中的代码保证执行,而不管是否捕获异常。但假设我们有以下代码: class Program { static void Main(string[] args) { try { int a = 0; int b = 2021 / a; } finally { System.Diagnostics.Debug.WriteLine("finally execute"

我们知道finally块中的代码保证执行,而不管是否捕获异常。但假设我们有以下代码:

class Program {
   static void Main(string[] args) {
      try {
         int a = 0;
         int b = 2021 / a;
      }
      finally {
         System.Diagnostics.Debug.WriteLine("finally execute");
      }
   }
}
我不能使用
Console.WriteLine
,因为未处理的异常会终止进程,没有输出写入控制台,所以我使用
System.Diagnostics.Debug.WriteLine
,希望能看到VS调试窗口中显示的“finally execute”

当我执行代码时,在调试窗口中没有找到“finally execute”,这意味着如果存在未处理的异常,finally块将不会执行

如果你看这个链接

它确实说:

第一部分

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

第二部分

finally子句不运行的唯一情况是程序立即停止。例如,由于IL语句损坏而引发InvalidProgrameException时。在大多数操作系统上,合理的资源清理将作为停止和卸载进程的一部分进行

我的问题是:

Q1第一部分中的“取决于计算机的设置”是什么意思


如果这取决于计算机的设置方式,那么第二部分是什么意思?我的示例中的异常是
DivideByZeroException
,而不是
invalidProgrameException
,因此,根据我的理解,为什么finllay块仍然不执行,最终将在这种情况下执行。由于您没有使用Catch块,它会将未处理的异常抛出到进程级别,所以finally块之后的任何语句都不会执行

这是代码

using System;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int a = 0;
                int b = 2021 / a;
            }
            finally
            {
                Console.WriteLine("finally execute");
            }
            Console.WriteLine("Complete");
            Console.ReadLine();
        }
    }
}
样本输出。

请参阅:我认为问题是专门针对Main方法的。“我无法使用Console.WriteLine,因为未经处理的异常会终止进程”-在您的示例中,这是不正确的。我刚刚试着用你的代码代替
Console.WriteLine
来调试
WriteLine
,没有问题。它写入控制台。此外,您的代码不会立即终止。最后块之后的代码继续运行,这就是我刚才说的。请确保在调试器外部运行应用程序,以防与第一次异常调试器(仅用于添加)混淆。关键是,如果在调试器外部运行,则最终将执行。@gunr217那么调试如何在未处理的异常中抑制最终块的执行?