VS C# 调试器中看似奇怪的行为

Seemingly odd behaviour in VS C# debugger

我的 form_load 方法中有这段代码...

System.IO.StreamReader file =  new System.IO.StreamReader(serverList);
Servers = new List<Server>();
String line;
//while ((line = file.ReadLine()) != null)
while (! file.EndOfStream)
{
    line = file.ReadLine().Trim();
    if (line[0] != '#' && line != "")
    {
        Servers.Add(new Server() { ServerName = line.Split('|')[0], 
            IPorHostname = line.Split('|')[1] });
    }
    else
    {
        MessageBox.Show("I don't understand what the debugger is doing!  Is this a bug?");
    }
}

我希望能够忽略正在读取的文件中的空行,因此我添加了 line != "" 位并在检查 if 语句之前修剪该行。加载应用程序时,服务器列表将为空。所以我切换到调试模式并进入这段代码。当 line 为空并且我在 if 语句上按 F11 时,debugging/stepping 停止并显示应用程序。我期望发生的是回到 while 循环,但那没有发生。

我添加了一个else,有一个消息框作为测试...消息框不显示!

简而言之,当 line 为空时,既不执行 true 也不执行 false 代码,调试器停止单步执行代码。

这里发生了什么?我是否遗漏了一些明显的东西,或者这是 Visual Studio 中的错误?

这是 Load 事件的问题。它的调用方式使得内部的异常被静静地吞噬。

作为代码中可能出错的示例,此行:

if (line[0] != '#' && line != "")
如果 line 变量包含空字符串,

将抛出异常,因为那时 line[0] 不正确,空字符串没有索引 #0。

但是,由于您是在 Load 事件中执行此操作,所以这样的异常就被吞没了。

要解决此问题,请在 Load 事件处理程序中添加一个 try/catch 块,围绕其中的所有代码:

private void Form_Load(...)
{
    try
    {
        ... all your existing code here
    }
    catch (Exception ex) // add more specific exception handlers
    {
        ... handle the exception here
    }
}

以下是 Stack Overflow 上关于此问题的一些其他问题和答案:

  • Why the form load can't catch exception?
  • VS2008 Debugger does not break on unhandled exception