2017-02-17 13 views
1

次のコードNullReferenceExceptionを生成しますが、(両方DebugReleaseモード)tryブロックでキャッチされていません。その代わり例外がキャッチされないのはなぜですか?

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

なぜですか?

更新:スコットによって示唆されるように、例外のテキスト表現:例外設定で、例えば画像上

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を指定できる場合は、アクセスする前にnull値をチェックする必要があります。 –

答えて

3

:チェックボックスのターン。

このようにすると、null参照例外がスローされたときにブレークしません。また、キャッチはExceptionをキャッチします。

+1

解決策を正確に特定した最初の回答であるため、この回答を正しい回答として選択しました。ありがとうございました! – salocinx

2

するとは、Visual Studio 2015を使用している場合:

デバッグ - >のWindows->例外の設定

とNullReferenceExceptionのため

検索し、そのチェックを外します。

3

このボックスは、あなたがそれをキャッチに引き続き見ることが引き続きヒットした場合には、catchブロックに到達する前に、あなたのデバッガのブレークを行い

enter image description here

を確認持っているので、それは起こります。このチェックボックスをオフにした場合は、Debug -> Windows -> Exception Settingsのプルダウンメニューから[例外設定]ウィンドウに戻ります。 「共通言語ランタイム例外」セクションには、NullRefrenceExceptionオプションが含まれています。

enter image description here

+0

詳細な回答ありがとう! – salocinx

関連する問題