我的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中的错误吗?
答案 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关于此问题的一些其他问题和答案: