我认为我在这里遗漏了一些非常微不足道的东西,但由于理由这对我来说并不明显。无论是否有异常,我总是认为“最终”总是会执行。
无论如何,这段代码无法运行,我不知道为什么。它到达i = i / j并抛出DivideByZero异常,但我认为它会继续并在停止之前执行finally语句。
static void Main(string[] args)
{
int i = 1;
try
{
int j = 0;
i = i / j;
Console.WriteLine("can't get");
}
finally
{
Console.WriteLine("finally ran");
}
}
答案 0 :(得分:5)
看看这个MSDN try-finally (C# Reference)
从上面链接:
通常,当未处理的异常结束应用程序时,无论是否 不是finally块运行并不重要。但是,如果你有 finally块中的语句,即使在那种情况下也必须运行, 一个解决方案是在try-finally语句中添加一个catch块。
答案 1 :(得分:4)
适合我 - 至少在某种程度上。当我从命令行运行它作为控制台应用程序时,“Test.exe已停止工作.Windows正在寻找解决方案”对话框立即出现,但是如果我点击“取消”按钮,我看到“终于跑了”。如果我让初始对话框运行完成,然后继续使用Debug或Close,那么点击Close将立即终止进程 ,然后点击Debug显然会调出一个调试器。
编辑:Mark Hall's answer更详细地解释了这种行为。我会留下这个答案,因为它包含实验结果,但看看Mark的答案:)
答案 2 :(得分:2)
Mark的回答说发生了什么,但我想我会提到原因:
我相信这是为了允许任何外部处理程序处理在执行finally
块之前处理的异常。 (例如,当附加调试器时,它可以尝试在异常点处中断,允许您在finally
块开始运行之前继续。)
如果预先执行了finally
块,那么您无法在调试器中处理异常。
答案 3 :(得分:0)
试试这个:
static void Main(string[] args)
{
int i = 1;
try
{
int j = 0;
i = i / j;
Console.WriteLine("can't get");
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("finally ran");
}
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
try
{
int j = 0;
i = i / j;
Console.WriteLine("can't get");
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("finally ran");
}
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
答案 4 :(得分:0)
我认为您可能需要catch
才能在finally
运行之前捕获异常。