出于某种原因,在我的控制台应用程序中,我无法运行 finally block 。我正在编写这段代码来测试 finally block 是如何工作的,所以它非常简单:
static void Main()
{
int i = 0;
try
{
int j = 1 / i; // Generate a divide by 0 exception.
}
finally
{
Console.Out.WriteLine("Finished");
Console.In.ReadLine();
}
}
起初我有 problem described here但后来我尝试在 Visual Studio 之外运行该程序时出现“程序已停止响应”错误。
最佳答案
因为您没有顶级异常处理程序,.Net 运行时会为您捕获异常并在程序最终有机会运行之前中止程序。这说明了这一点:
static void Main()
{
try
{
int i = 0;
try
{
int j = 1 / i; // Generate a divide by 0 exception.
}
finally
{
Console.Out.WriteLine("Finished");
Console.In.ReadLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
使用这段代码,异常现在在调用链中更高层的 try...catch 中处理(恰好在同一方法中),因此嵌入的 finally 将被执行。 catch 不必在引发异常的同一函数中,它可以在调用链中的任何位置。
编辑:最初您的程序似乎不确定何时何地捕获异常。但是想想你的应用程序的边界,外部世界与你的代码交互的地方——通常它们是有限的并且定义明确。所以对于控制台应用程序,边界是 Main 方法,这是您可以放置顶级异常处理程序的地方。对于 Web 窗体应用程序,边界包括按钮单击事件(用户正在与您的 UI 交互)之类的东西,因此您也可以在其中包含异常处理程序。对于类库,边界通常是调用库的应用程序的边界,而不是库本身。因此,不要在库中捕获异常(除非您可以明智地从中恢复),而是让它们冒泡到调用应用程序。
关于c# - 尝试后终于没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163149/