2010-12-29 12 views
2

try、catchブロックを使用すると、例外がスローされた場合、catchの処理後にプログラムの実行が停止されます。しかし、例外があってもプログラムの実行を続ける必要があります。どのように私はそれを行う方法を助けることができますか?Continue try catch後もプログラム実行

+2

コードサンプルを用意して、最後に使用を調べることを検討してください。 –

+3

「私はプログラムを続ける必要があります...」と言うと、正確にどこから続けるのですか?例外がスローされたステートメントから、またはtry/catchブロックの後、または...? –

答えて

7

私が正しく理解していれば、ここであなたが希望しているものです:

try 
{ 
    Statement1(); // <-- Exception is thrown in here 
    Statement2(); // <-- You want to go here after the catch block executes 
} 
catch 
{ 
    HandleException(); 
} 

のtry/catchブロックは、そのように動作しません。あなたは次のように代わりに、あなたのコードを書き直す必要があります:

try 
{ 
    Statement1(); 
} 
catch 
{ 
} 


try 
{ 
    Statement2(); 
} 
catch 
{ 
} 
3

例外を処理し、catchブロックから例外(または別の例外)を再スローしない場合は、プログラムを再開する必要があります。

さらに、特定のタイプの例外をキャッチしている(IO例外を言います)が、tryブロックのコードが別のタイプ(SQL例外など)を投げている場合、ブロックcatchはそれをキャッチせず例外プログラムが終了するまでバブルアップします。

catchブロックではどういうことをしていますか?

2

あなたが

try 
{ 

} 
catch(MyException ex) 
{ 

} 
finally 
{ 
// other code to be done 
} 

いますが、プログラムがクラッシュを言っている場合、あなたの機能を継続するために、最終的に使用できる機能(ないプログラム)について話している場合、引数なしのcachはそれを処理できます。

9

キャッチされない例外が実行を終了します。

例外がキャッチされ、再スローされない場合、catch()句が実行され、finally()句があればそれが実行され、try/catch/finallyブロックの次の文で実行が続けられます。

例外がキャッチされて再スローされた場合、throw文までcatch()句が実行されます。 finally()節があればそれが実行されます)、例外が(再)スローされ、スタックの巻き戻しが継続されます。

finally()節が有効範囲外になるとfinally()節が実行され、ステートメントを使用して宣言された変数はDispose()が呼び出されてスコープ外になります。

元の例外がスローされた時点でコントロールが再開しないということは起こりません。 Main()メソッドのような高レベルで例外をキャッチしていて、元の障害点で実行を続けると思うように思えます。

これを実現するには、処理が文脈上で意味をなさない時点で例外をキャッチし、例外を処理した後、失敗した操作を再試行するか、問題を無視する必要があります。

例外処理をうまく行うことはむしろ困難です。したがって、例外処理のベストプラクティスはそれを処理しないという言い方です。例外はそれだけであるはずです:例外的です。あなたのコードはもちろん例外として例外をスローするべきではありません。また、検証技法やフロー制御オペレータとして例外を使用することは一般的ではありません。

+1

はい、確かに。トリック質問:次の2つのtry/catchブロックの違いは何ですか? が {...} {...} キャッチを試みる {...} キャッチ(例外e) {...} とを試します –