2011-12-30 11 views
1

私はNullReferenceExceptionをキャッチしていない非常に標準料金のtry/catchを持っています。 .Tagプロパティを使用してフォームから日付値を返そうとしています。このタグは頻繁にnullになりますが、これは問題ありません。以下のコードは私にとっては最もシンプルなようですが、それは捕まえられません。以下Diggingforfire提案ごとに解決される問題:すべてのヘルプは素晴らしい、事前に感謝...私のキャッチブロックがキャッチしないのはなぜですか?

public void ScheduleDataRun() 
     { 
      FrmSetTimer frmSetTimer = new FrmSetTimer(DateTimeOfNextAvailableDataRun); 

      try 
      { 
       frmSetTimer.ShowDialog(); 
       DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag; 
       SetDataRunTimer(DateTimeOfNextScheduledDataRun); 
       Status = DRMStatus.Scheduled; 
      } 
      catch 
      { 
       Status = DRMStatus.Inactive; 
       StatusChanged(); 
      } 
     } 

編集だろう「デバッグ - > [例外]メニューでは、あなたがスローされ、ユーザーが未処理の例外でブレークするかを選択することができます」

+7

例外をスローしてキャッチするのは高価ですが、ifステートメントを使用してnullをチェックする方が良いでしょう。例外は例外条件であり、「頻繁に」発生するものは実際に「例外的」ではありません。 –

+2

デバッガで実行していますか?おそらく、デバッグ中に例外を無効にしたことがありますか? – diggingforfire

+1

なぜそれは捕まえられないと思いますか? –

答えて

2

キャッチブロックでヌル参照例外が発生していないことを確認してください。

try 
    { 
     frmSetTimer.ShowDialog(); 
     DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag; 
     SetDataRunTimer(DateTimeOfNextScheduledDataRun); 
     Status = DRMStatus.Scheduled; 
    } 
    catch (NullReferenceException) 
    { 
     Status = DRMStatus.Inactive; 
     StatusChanged(); 
    } 

はEDIT:これが動作しない場合は、それも最初の場所であなたの「キャッチ」ブロックに入ったかどうかを確認するために、デバッガを使用してみてください

+0

ここでうんざりしています:DateTimeOfNextScheduledDataRun =(DateTime)frmSetTimer.Tag; – StatsViaCsh

+0

はい、何が起こりますか?次のコード行は何を実行していますか? – McKay

1

はこれを試してみてください。

+1

それはちょうど 'e'が割り当てられているが使用されていないとコンパイラに不平を言うようにするつもりです... –

+0

これはそれをキャッチしませんでした.. – StatsViaCsh

+0

@Robert例外が使用されない場合は、 catch(NullReferenceException)を実行して警告を回避します。 –

7

これは実際に質問に答えるものではありませんが、例外が発生してキャッチすることは、簡単なifテストで十分である場合は悪い習慣とみなされます。編集:さらに、例外は明白に、nullDateTimeにキャストしようとしたために発生しています(これは値のタイプです。私よりも目の肥えたコメント作成者のおかげで)、 キャスティング。次のことを試してみてください。

frmSetTimer.ShowDialog(); 
if (frmSetTimer.Tag == null) { 
    Status = DRMStatus.Inactive; 
    StatusChanged(); 
} 
else { 
    SetDataRunTimer((DateTime)frmSetTimer.Tag); 
    Status = DRMStatus.Scheduled; 
} 

これはSetDataRunTimer()は、引数がnullの場合でもトリガするだろうと任意の副作用を持っていないことを前提としています。そうであれば、引数がnullかどうかを呼び出す必要があるので、nullを正常に処理するようにメソッドを変更してください(boolを返すか、正常に処理されたかどうかを示す戻り値はArgumentNullExceptionです)。また、nullを渡すことができるようにするには、DateTime?にする必要があります。 NullReferenceExceptionはバグのないコードで投げられるべきではないので、明示的にキャッチされるべきではありません。つまり、NullReferenceExceptionは常にプログラミングエラーの兆候です。

+0

私はその提案について楽観的でしたが、うまくいきません...割り当て(nullのチェック前の行)が例外をスローしています。 – StatsViaCsh

+0

DateTimeOfNextScheduledDataRunが値型(つまり、DateTime)であると仮定すると、if文が真となるでしょうか? frmSetTimer.Tagがnullであるかどうかを確認しない方が適切でしょうか? –

+0

@GarryVass:私はそれを見ていないとは信じられない - あなたは間違いない。コードを更新しました。 –

1

SetDataRunTimer内に、例外を「飲み込む」可能性のあるキャッチブロックがないことを確認してください。 Hereはいくつかの便利な例外ガイドラインです。

+0

今見て、感謝.. – StatsViaCsh

1

私はなぜそれが投げていないと思うのか不思議です。あなたは何を期待していますか?あなたは漁獲量にブレークポイントを設定しましたか?デバッグ - >例外メニューでは、スローされた例外とユーザー未処理の例外を解除することができます。

関連する問題