使用F5在C#控制台应用程序中最终似乎无法执行

12
int i=0;
try{
    int j = 10/i;
}
catch(IOException e){}
finally{
    Console.WriteLine("In finally");
    Console.ReadLine();
}

在VS2008中按F5时,finally块似乎不会执行。 我在控制台应用程序中使用了这段代码。


+1让我对调试器的行为有了新的认识! - Dan Puzey
5个回答

11

在使用Visual Studio进行调试时,如果出现未捕获的异常(例如:除数为零异常),调试器会停止执行程序。在调试模式下,Visual Studio会优先中断程序执行并弹出一个错误提示框,而不是让应用程序崩溃。这是为了帮助您找到未捕获的错误并修复它们。如果您取消调试器的连接,则不会发生这种情况。

尝试从控制台以非调试模式运行该程序,并且不附加调试器,您将看到程序输出的信息。


是的,没有调试我能看到这条消息。那么这是否意味着在调试模式下finally语句不会执行? - Mohammad Nadeem
@Nadeem:不,它并不意味着那样。它意味着你的异常未被处理,这导致调试器停止执行。如果你处理异常,那么事情将按照你的期望工作。 - Mark Byers
好的,这意味着在调试模式下执行会在这种情况下被卡住。在这种情况下没有办法进入最终块。 - Mohammad Nadeem
在 catch (Exception) {} 块中处理其他异常。 - devnull
我怀疑如果你在VS中按F5并让调试器继续,你会看到finally在会话结束之前执行。 - Dan Puzey
尽管很奇怪,它并不像Mark Byers所说的那样执行,但我很惊讶它在应用程序退出时没有执行finally块。 - Dan Puzey

2
如果您希望在调试时执行它,有两件事情可以做:
1) 捕获正确的异常:
int i = 0; try { int j = 10 / i; } catch(DivideByZeroException e){} finally { Console.WriteLine("在finally块中"); Console.ReadLine(); }
2) 告诉Visual Studio忽略未处理的异常。进入Debug-->Exceptions, 然后您可以取消选中公共语言运行时(CLR)异常“用户未处理”选项,或者展开该节点并取消选中单个异常类型。

1

F5会继续运行应用程序直到下一个断点或未处理的异常。

我认为你应该使用F10进行逐步调试,或者打开所有异常(已处理或未处理)的中断。


你是在发布模式下编译吗? - leppie
你确定你没有改变项目设置吗? - leppie
1
我刚刚测试了你的准确代码。你看到的确切行为是什么?我在除以零时遇到了调试器中断。然后我将指令点向前移动了一行,finally 语句执行了。 - leppie

0

不要通过F5运行您的应用程序。在调试模式下,您无法跳过异常,消息框会一遍又一遍地弹出。

相反,通过CMD、Far Manager等构建并运行它。


最终这意味着在调试模式下最终不会被执行。 - Mohammad Nadeem
当然,你可以跳过异常,默认情况下它会跳过所有已处理的异常。其次,你可以将指令指针移动到下一行。 - leppie
@Nadeem:无论如何,finally块中的代码始终会被执行。 - leppie

0
作为最终结论,我们都应该同意,如果有未处理的异常并且应用程序正在运行调试模式下,最终不会被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接