2011-01-14 8 views
2
try 
{ 
    statement 1; 
    statement 2; 
    statement 3; 
    statement 4; 
    statement 5; 
} 
catch 
{ 
} 

上記は典型的なtry-catchです。 statmentの1つがキャッチされると、コーディングは残りのステートメントをジャンプします。私が何をしたいかC#で例外の計算を再開するには?

ます。..

文2にエラーがあると例外になり、のは言わせて、私はまだ声明3,4に仕事をしたい、と5

私はジャストm私はそれをどのように達成できますか?

最も単純な答えは、5回のtry-catchです。

しかし、私はそれがあまりにも幼稚だと思う。

+0

あなたがC#で「次のエラー履歴書に」したいですか? – Simon

+0

* *例外を処理したいときは? '2'と' 4'の両方が例外をスローするとどうなるでしょうか? '5'が終わったら両方を扱いたいですか?あるいは、すべてのエラーを無視したいだけですか? – Ani

+2

私はこれが良い考えであるシナリオを考えるのに苦労します。もう少し文脈を与えてくれますか? – Simon

答えて

6

個別のtry .. catch構造体を使用することは、最も具体的な例外(さまざまなステートメントで異なる場合があります)を処理する必要があるため、一般的に行うのが最善の方法です。また、例外によって無効な状態が作成される可能性があるため、続行が最善の方法ではない可能性があります。

あなたはそれを書くための簡単な構文を探しているとあなたは同じ例外処理を繰り返す必要がある場合は、ラムダを使用してのようなものを書くことができます。

CallWithCatch 
(() => statement1, 
    () => statement2, 
    () => statement3, 
    /* ... */); 

CallWithCatchの定義がどのように見えますこれは:

void CallWithCatch(params Action[] statements) { 
    foreach(var statement in statements) { 
    try { 
     statement(); 
    } catch(/* your exception */) { 
     // your exception handler 
    } 
    } 
} 
+0

これは良い考えになるケースを考えることができます:) – Simon

1

個々の例外を個別にキャッチする必要があります。

try 
{  
    statement 1;  
} 
catch {} 

try 
{ 
    statement 2; 
} 
catch {} 

// etc 

代わりに、あなたは自分のtry/catchが含まれているそれぞれの独自のメソッドにstatement1statement2などを抽出することができます。このようにして、それぞれの操作は特定の例外に関係する可能性があり、処理されない例外をすべて正常に処理することができます。

3

一般的に言うと、すべてのステートメントは例外をスローする可能性があります。例外がスローされた場合は、引き続き次のステートメントを実行します。最も簡単な解決策は次のとおりです。

try 
{ 
    statement1; 
} 
catch {} 
try 
{ 
    statement2; 
} 
catch {}; 
... 

改善は次のとおりです。

その後、
public void TryStatements(params Action[] actions) 
{ 
    foreach(Action act in actions) 
    { 
    try 
    { 
     act(); 
    } 
    catch(SomeCommonException ex) 
    { 
     //do something special 
    } 
    catch(Exception ex) 
    { 
     //something else 
    } 
    } 
} 

次のことができます。

そう
TryStatement(()=>statement1,()=>satement2); 
関連する問題