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
我的 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