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

时间:2016-05-08 20:00:49

标签: c# winforms visual-studio-2012

我的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时,调试/步进停止,应用程序显示。我期望发生的是回到while循环,但这不会发生。

我添加了一个其他内容,并将消息框作为测试...消息框无法显示!

简而言之,当line为空时,既不执行真代码也不执行伪代码,调试器会停止逐步执行代码。

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

1 个答案:

答案 0 :(得分:3)

这是Load事件的问题。它以这样一种方式调用,即内部异常被静默吞噬。

作为代码可能出错的一个例子,这一行:

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

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

但是,由于您在Load事件中执行此操作,因此只会吞下此类异常。

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

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

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