2016-05-08 70 views
1

我有我的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中的错误?

回答

3

这是Load事件的问题。它被这样调用,以致内部的异常被无声地吞噬。

至于什么可以去错在你的代码,该行的例子:如果line变量包含一个空字符串

if (line[0] != '#' && line != "") 

会抛出异常,从此line[0]不正确,没有索引# 0表示空字符串。

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

要解决这个问题,在里面添加try/catchLoad事件处理中,周围的所有代码:

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

以下是有关这个问题上堆栈溢出一些其他的问题和答案在这里:

+0

我刚换了条件'line!=“”&& line [0]!='#'',我的代码按预期工作。你的回答是正确的,是有道理的。 (这让我感到莫名其妙)我会在8分钟内接受你的回答,当它允许我时:) – MrVimes

+0

是的,修正了异常,但它不能解决你的其他问题,Form_Load中引发的异常会被无声地吞噬。你应该围绕该方法添加一个try/catch块,或者最好找到一个不同的事件来放置你的代码。 –

+0

我将添加代码来处理异常,但现在,交换条件会使我的应用程序运行,更重要的是现在我明白发生了什么。 – MrVimes