2017-01-29 4 views
0

try-catchブロックで囲んだコードセクションがあります。私が期待した結果が得られなかったので、私はこれをしました。しかし今、私はtry-catchブロックから期待した結果を得られません。Try-Catch健全性チェック

私の理解は、tryブロック内のコードが実行されることです。例外がスローされた場合、catchブロックはそれをキャッチし、その後コードが移動します。

私が見ているのは、例外を投げるtryブロックのコードです。 catchブロックがキャッチし、ToString()という例外を持つメールを私に送信します。しかし、tryブロックのコードは途中で中断しています。私はそれが途絶えたところで元に戻ってくるとは思わなかった。私はそれが終わったと思った。ここで

は私がやっていることのいくつかのpsudoコードです:

try 
{ 
    var context = New DbContext(); 

    for(var i = 0; i < 5; i++) 
    { 
     var records = ABunchOfRecordsThatIGather(OneHundredAtATime); 

     foreach(var record in records) 
     { 
      context.Add(record); 
     } 

     context.SaveChanges(); 
     context.Dispose(); 

     context = New DbContext(); 
    } 

    SendMeASuccessEmail(); 
} 
catch (Exception ex) 
{ 
    SendMeAnEmailOfTheException(ex.ToString()); 
} 

私は、さまざまなエラー(別の質問)を取得していますが、それらのいくつかはSystem.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraintエラーで、そのうちのいくつかはあるA transport-level error has occurred when receiving results from the server ishエラー。

100レコードを挿入した後にエラーが発生した場合(500を挿入する必要がある場合)、100(私も自分自身にメールを送信したカウンタがある)、そして成功メールそれが終わった後。しかし、それは私が見ているものです。私は後でエラーメールと成功メールの両方を受け取る。

誰でも私のためにこれを明確にすることはできますか?

EDIT:コメントはかなり話題をオフに行ってきましたので
、私はうまくいけば芽でそのニップに私のPSUDOcodeを編集します。ここに行く:

try 
{ 
    DoSomeEntityFrameworkStuff(); 

    SendASuccessEmailIfAllIsWell(); 
} 
catch 
{ 
    SendAFailureEmailIfSomethingBadHappens(); 
} 
+3

これは当てはまりません。あなたはどこか他の場所から呼び出しているかもしれませんが、例外をスローする行にブレークポイントを前後に置いてみてください。例外行の後に始まります。 –

+2

あなたの関数はどこかの非同期要求(クライアント側)おそらくタイマーやクライアント側のイベントを通じて複数回に分かれていますか? –

+0

@AliBaig私はもっと同意できませんでしたが、それは本当です。完全に混乱させる。私は本番環境(これが起こっているところ)でデバッグする方法がなく、開発サーバー上で完全に動作します。おそらく、EntityFrameworkの何かが、他のものとは別の例外をスローすることが許されていると思っていました。それが私の正気を維持しなければならない唯一のアイデアです。つまり、実際にはハードウェア障害が混乱の原因になっている可能性があります(不良RAMまたはランダムビットを反転させる何か他のもの)。 – FlipperBizkut

答えて

0

例外の後に中止された場所でコードが取り上げられることはありません。コードはsubsiquentラインを実行した後に

  • があなたの送信成功です

    1. が非同期呼び出しありますので、例外が発生している:

      私はあなたがチェックできる3つの可能性/物事を示唆しているあなたのpsudoコードに基づいて、プログラムが完了する前にその電子メールを受け取るように、forループ内の電子メールを受け取るようにしてください。
    2. 複数のtry catchブロックがありますか?その場合、例外は内部try catchブロックによって「飲み込まれた」可能性があります。
  • +0

    try catchブロックは1つだけです。メソッド全体がtry catchです。非同期呼び出しはありません。 send emailメソッドは、コード内の最終的なものです(tryの最後の行であるcatchの中のもののみ)。それは本当に私にとって何にも意味をなさない(これが私がここに投稿した理由です)。 – FlipperBizkut

    +0

    これは唯一の回答であり、少なくともトラブルシューティングに役立ちますので、答えとしてマークされています。 – FlipperBizkut

    関連する問題