2016-10-31 6 views
-1

C#を使用すると、foreach以外の部分を使用できますか?例外的なシナリオをスキップして、次のレコードの検証に移行することができますか?私のシナリオによると、foreachループでcontinueを使用する代わりに、別の方法でコードをリファクタリングする必要があります。foreachループブロックの外側にある文を続ける

foreach (var name in Students) 
{ 

//forloop should continue even if there is any logic exception and move to next record 
CheckIfStudentExist(); 

} 

private void CheckIfStudentExist() 
{ 
try 
{ 
//do some logic to verify if student exist & take to catch if there is some error in logic 
} 
Catch(Exception) 
{ 
continue; 
} 

} 
+1

ロジックに何らかのエラーがある場合は「キャッチ」しないでください。ディスクスペースの不足やネットワーク接続の切断など、コード化できない例外を検出する必要があります。独自のロジックをコーディングする場合は、それが堅牢であることを確認する必要があります。可能な限り 'try' /' catch'を避けてください。 – Enigmativity

答えて

1

ループブロックの外側にcontinue文を書くことはできません。

例外をサイレントにしたい場合は、catchブロックを空のままにしてください。

private void CheckIfStudentExist() 
{ 
    try 
    { 
     //do some logic to verify if student exist & take to catch if there is some error in logic 
    } 
    catch 
    {  
    } 
} 

ただし、空のcatchブロックは悪い習慣です。例外が永遠に失われないように、少なくともいくつかのログステートメントを内部に書いてください。

独自のビジネス例外クラスを宣言して、特定の例外タイプを捕捉し、他のタイプの(致命的な)例外を残して、コード実行を停止できるようにする方が良いでしょう。

private void CheckIfStudentExist() 
{ 
    try 
    { 
     //do some logic to verify if student exist & take to catch if there is some error in logic 
    } 
    catch(ValidationException e) 
    {  
     // example of the log statement. Change accordingly. 
     Log.Error(e, "Validation failed when validating student Id {0}", studentId); 
    } 
} 
+0

ログだけで例外ブロックが発生した場合にスローやプログラムが破損することはないでしょうか? – Kurkula

+1

@Kurkulaはい、キャッチブロックがあり、キャッチされた例外を再スローしたり、新しいキャッシングブロックをスローしたりしない場合、catchブロックの次のステートメントにコードの実行が続行されます。 –

関連する問題