2010-11-24 7 views
2

Hey :)
を処理する方法はありますか?例外は全世界で例外ですか?私は、 "AppDomain.CurrentDomain.UnhandledException"と "Application.ThreadException"で未処理の例外をキャッチできることを知っていますが、既にキャッチした例外(ログなどの書き込みなど)にいくつかの処理を追加したいと考えています。処理された例外をキャッチする

答えて

2

あなたは同じ例外を再スローし、モジュール/ロギングモジュールを呼び出すことでそれをキャッチし、それを記録することができます。たとえば :

private void DivideByZero() 
{ 
try 
{ 
    int x = 2/0; 
} 
cath(Exception ex) 
{ 
    Console.Writeline(ex.ToString()); 
    throw; 
} 
} 

void Main(string[] a) 
{ 
    try 
    { 
     DivideByZero(); 
    } 
    catch(Exception x) 
    { 
     // write logging code here .. 
    } 

} 
+1

+1。 –

+1

Rethrowingは例外*が処理されなかったことを意味します。 –

+0

@Brianは、彼は私が彼にそれを行うための1つの可能な方法を示したように、「取り扱い」の例外をキャッチする方法を知りたいです。他の方法もあります。 – Shekhar

4

一般的には、おそらくあなたのコード内で可能な限り低いレベルでの例外をキャッチしたいです。例外がどこで発生したかに関連してそれらが近づくほど、それらの原因となった問題を修正する必要があります。あなたは、例外の原因となった問題を固定する希望を持って、このレベルでの是正措置を取ることができない場合は

、あなたはすべてでそれを扱うべきではありません。例外をバブルアップさせ、必要に応じてグローバルに処理します。あなたが持ってきた場合

が言われていること、下位レベルの例外扱い、あなたがより高いレベルでそれをキャッチすることができるようになるだろう唯一の方法はされている場合Catchブロックからrethrow itより低いレベルで。
ですから、例えば:もちろん

try 
{ 
    //your code 
} 
catch (SomeException e) 
{ 
    //take any relevant handling measures 

    //rethrow the exception 
    throw; 
} 

、これは技術的に低いレベルでのこのtry/catchブロックで例外が未処理であることを意味するが、それはあなたが何かを持っているつもりだ唯一の方法ですより高いレベルで捉える。

再スロー例外の詳細については、以下を参照してください。

0

はありません、グローバルな例外イベントがありません。それは非常に危険です。あなたは、公共の使用のためのものではない他のモジュールからあらゆる種類の内部例外をキャッチします。また、潜在的にあなたのログを例外で溺れさせるでしょう。

あなたは同じ効果を達成するために、あなたの例外処理について、より構造化する必要があります。例外の実際の処理をカプセル化し、実際のキャッチブロックで最小限の作業を行います。いずれかの "HandleException"メソッドをどこかにもあなたがすべての例外を渡すことによって。エンタープライズライブラリのException Handling blockもご覧ください。再スローため

+0

私は、エンタープライズライブラリの例外処理ブロックが、各「キャッチ」ブロックで呼び出される何らかの種類のデリゲートを提供できることを理解しました。あれは正しいですか? –

関連する問題