【问题标题】:Why isn't the finally getting executed?为什么finally没有被执行?
【发布时间】:2012-12-25 03:00:02
【问题描述】:

我的假设是只要程序运行,finally 块总是会被执行。但是,在这个控制台应用程序中,finally 块似乎没有被执行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new Exception();
            }
            finally
            {
                Console.WriteLine("finally");
            }
        }
    }
}

输出

注意:当抛出异常时,windows 询问我是否要结束应用程序,我说“是”。

【问题讨论】:

  • 点击no看看会发生什么
  • 从命令行而不是在您的 IDE 中运行它
  • 看起来很奇怪。 'finally' 应该写在 StackTrace 之后。
  • 没有catch,异常未处理,应用退出
  • Ilya - 没有选择拒绝。另一种选择是“调试”。 Kevin - 它从命令行运行,而不是 IDE。

标签: c# .net exception try-catch try-finally


【解决方案1】:

它实际执行了。只是你没有注意到。就在你看到Windows is checking for a solution to the problem的时候点击Cancel就可以看到了。

【讨论】:

  • 你在什么环境下运行?我正在使用 Windows 7、64。当它询问您“Windows 正在检查问题的解决方案..”时,不要单击取消。让它做它的事。
【解决方案2】:

当您得到“ConsoleApplication1”已停止响应时,您有两种选择。

如果您按取消,则允许未处理的异常继续,直到最终终止应用程序。这允许finally 块执行。如果您不按取消,那么Windows Error Reporting 会停止进程,收集一个小型转储,然后终止应用程序。这意味着finally 块没有被执行。

或者,如果您使用更高级别的方法处理异常,您肯定会看到finally 块。例如:

static void unhandled()
{
    try
    {
        throw new Exception();
    }
    finally
    {
        Console.WriteLine("finally");
    }
}

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
    try
    {
        unhandled();
    }
    catch ( Exception )
    {
        // squash it
    }
}

总是给出“finally”的输出

【讨论】:

    【解决方案3】:

    您可能正在调试,当您单击“否”时,调试器正在暂停执行。

    【讨论】:

      【解决方案4】:

      从命令行运行时。就在 Windows 试图优雅地结束应用程序时,如果应用程序没有响应,请单击 nocancel

      【讨论】:

      • 你在什么环境下运行?我正在使用 Windows 7、64。当它询问您“Windows 正在检查问题的解决方案..”时,不要单击取消。让它做它的事。
      • 然后 Windows 将终止应用程序而不让它打印到控制台
      【解决方案5】:

      异常会在堆栈中冒泡,直到找到处理程序。如果没有,则程序退出。在您的场景中就是这种情况...没有处理程序,因此程序在到达 finally 块之前退出。

      【讨论】:

      • -1 - finally 应该在堆栈冒泡之前执行 - 事实上,堆栈展开期间。
      • 如果没有捕捉到,finally 的全部目的显然失去了它的用途?那是我的一个新的:L
      • 对不起,这是一个轻率的回答。
      猜你喜欢
      • 2013-03-14
      • 2012-04-07
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多