2016-05-08 69 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