2017-02-17 85 views
1

下面的代碼生成一個NullReferenceException,但不是由try塊(在DebugRelease模式)捕獲:突出顯示爲什麼異常未被捕獲?

using System; 

namespace ExceptionTest { 
    public class Program { 
     public static void Main(string[] args) { 
      String text = null; 
      try { 
       if (text.Equals("t1")) { 
        Console.WriteLine("r1"); 
       } else { 
        Console.WriteLine("r2"); 
       } 
      } catch(Exception ex) { 
       Console.WriteLine("Exception catched!"); 
      } 
     } 
    } 
} 

代替程序中斷和有問題的行:

enter image description here

爲什麼?

更新:如由Scott建議的例外的文本表示:

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=ExceptionTest 
+9

*您可能已經*您調試器配置在第一次機會異常中斷。如果你在沒有附加調試器的情況下運行它,它是否會打印「Exception catched」? – vcsjones

+0

也有你嘗試過使用'=='如果我沒有弄錯它拋出異常比'string.Equals(string)' – Andrew

+3

拋出異常通常是不好的做法,趕上這樣的一般例外。它可能會導致代碼中出現空間不可追蹤的行爲。更何況例外是非常不高效的。 如果一個變量可以爲null,那麼在訪問它之前應該檢查一個空值! –

回答

3

論下例外設置示例圖像:複選框的轉彎。

通過這樣做,它將不會在引發空引用異常時中斷。並且catch會捕獲異常。

+1

我選擇了這個答案作爲正確答案,因爲它是第一個指出解決方案的答案。謝謝! – salocinx

2

如果您使用Visual Studio 2015年:

調試 - > Windows的>例外設置

搜索的NullReferenceException,並取消勾選。

3

它發生,因爲你必須選中此複選框

enter image description here

,使您的調試器打破它到達catch塊之前,如果你打你下去會看到它繼續到catch。如果取消選中該框,則可以在通過Debug -> Windows -> Exception Settings下拉菜單找到的「例外設置」窗口中重新啓用該框。 「公共語言運行時例外」部分包含NullRefrenceException選項。

enter image description here

+0

感謝您的詳細解答! – salocinx