2011-01-04 4 views
1

try-catchブロックを適用して例外を捕捉する正しい方法は何ですか?C言語でtry-catchブロックを使用する正しい方法は何ですか?

レッツは、私はこのようなコールである階層方式の4つのレベルを持っていると言う:

method1(){ 
    method2(){ 
     method3(){ 
      method4() 
     } 
     morecode that depend of what happend in method3 
    } 
    morecode that depend of what happend in method2 
} 

だから、私は何をすると、例外を提示しようとしている可能な方法から、私はコードのことを持っているように、内側からラップですそれらのコードがクラッシュを引き起こすのを避けるために、 "スロー"文を使用して例外を伝播するメソッドのさまざまなレベルに依存します。

method1(){ 
    try 
    method2(){ 
     try 
     method3(){ 
      try 
      method4() 
      catch 
      throw 
     } 
     catch 
     throw 
     morecode that depend of what happend in method3 
    } 
    catch 
    return 
    morecode that depend of what happend in method2 
} 

これは正しい方法ですか?または私は文を投げるのをひどく使いますか?

+2

@Danielペナルバ:あなたは周りの間違った方法ということがある - 「スローexは、」スタックトレースをリセットします。それは悪いアドバイスです。 –

+0

@DanielPeñalba:あなたがそれをお勧めするなら、あなたはそれを理解していません。何かを推測するのに十分な情報はほとんどありません。 – leppie

答えて

4

実際にはDOとなるように、最初のレベルで例外をキャッチする必要があります。

最終結果が同じ「汎用」アクションである場合は、複数のtry-catchブロックを持つ必要はありません。ただ1つのキャッチを使用し、エラーを処理してください。

しかし、キャッチブロックが結果を変更して、呼び出し側のメソッドが異なる反応をする可能性がある場合は、それを埋め込む必要があります。

例外処理トピックに関するかなり複雑だが重要な課題である...

推奨タイトル:あなたが必要とする何かを持っているとき、さらに下にあなたのコールhirachyでRobust ASP.Net Exception Handling

+0

これは私に起こることです。キャッチブロックは、それらのクラッシュメソッドを実行しようとすると、異なるオブジェクトを間違った状態に残すため、正常に戻すために使用されます。たぶん私のコードが結合されているかもしれません。 – mjsr

+0

あなたの例外がコードを間違った状態にしている場合は、TRYとFINALLYブロックを使用します - FINALLYブロックで割り当てを解除しますが、例外が本当に欲しいポイントまでスタックをバブルアップできるようにします例外を処理します。それ以外の場合は、永遠に例外を投げて例外を投げてしまい、問題が発生する可能性があります。オプションで、USINGキーワードを使用してください。例外がスローされた場合は、自動的に割り当て解除されます(適用可能であれば!) – Dekker500

+0

私はアイデアを得ていると思います。可能な外装層の問題を解決する正しい方法があるように思われる。他の関連する質問があります。内部コードが他のコードで広範囲に使用されているのであれば、まったく興味はありませんか?...外部レイヤーを常に最善の方法で管理していますか?最後に、内側のコードがそのコンテキストでしか知られていないオブジェクトを変更した場合、どのように外層の順序を再確立できますか? – mjsr

1

(個人的に)私は例外的なケースごとに回避策を試み、は必要なところでtry/catchブロックでコードを捨てるだけです。

6

catchで行うことがすべて再実行される場合は、tryを気にしないでください。

例外はバブルアップするので、それを捕まえて再投げる必要はありません。正しいスタックトレースが得られます。

+0

良い点は、多くの人がこれを残念ながら(そして間違っている可能性があります)。 – leppie

0

のtry/catchブロックにのみ必要です最終的なブロックで浄化される。例外を再びスローする場合は、不要なコードを追加します。

オブジェクトがIDisposableを実装している場合、[使用]ブロックの下限を使用することもできます。

0

例外の処理方法がわかっている場合に備えて例外をキャッチします。 他の方法は、元の例外を内部の例外として設定して新しい例外を再発行することです。場合によっては、例外をよりよく処理するのに役立ちます。

0

tryステートメント内で何かが失敗した場合、catchステートメントが実行されることを考慮して、tryメソッドを1つだけ使用するだけです。あなたは例外を投げることを望んでおらず、それらを処理しようとし、処理できないイベントが発生した場合にのみ例外をスローします。

投稿したようなデザインを避けるようにアプリケーションを設計します。

+0

内部メソッドが他の場所で集中的に使用されている場合は、何を提案しますか? – mjsr

0

あなたはこのような何かを試すことができます。

 try 
     { 
      // Your code 
     } 
     catch (Exception ex) 
     { 
      switch (ex.Message) 
      { 
       case "Some system exception information":      
        MessageBox.Show("Your text to replace system exception information", 
        "Warning", 
        MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        break;  
       default: 
        MessageBox.Show(ex.Message, 
        "Warning", 
        MessageBoxButtons.OK, MessageBoxIcon.Warning);      
        break; 
      } 

     } 
関連する問題