我的假设是,只要程序正在运行,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询问我是否要结束应用程序,我说'是'。
答案 0 :(得分:6)
它实际执行了。只是你没有注意到。就在您看到Windows is checking for a solution to the problem
时,点击取消并查看。
答案 1 :(得分:3)
您可能正在调试,当您单击否时,调试器将暂停执行。
答案 2 :(得分:2)
从命令行运行时。就在Windows尝试正常结束应用程序时,如果应用程序没有响应,请单击no
或cancel
。
答案 3 :(得分: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”
答案 4 :(得分:-2)
异常在堆栈中冒泡,直到找到处理程序。如果没有,程序退出。在您的场景中就是这种情况......没有处理程序,所以程序在它到达finally块之前退出。