2009-03-02 23 views
3

現在、私はwinformsアプリケーション(C#)を作成しています。オブジェクトインスタンスでスローされた例外をグローバルに捕捉する方法

私は、私が見るものからかなり標準的なアプローチに従って、エンタープライズライブラリ例外処理ブロックを使用しています。 IE:Program.csのMainメソッドでは、イベントハンドラをApplication.ThreadExceptionイベントなどに接続しました。

このアプローチはうまく動作し、アプリケーションの例外的な状況を処理します。

私のビジネスオブジェクトの一つで、私は、オブジェクトのプロパティの1のsetアクセサでさまざまな例外をスロー

set { 

    if (value > MaximumTrim) 
    throw new CustomExceptions.InvalidTrimValue("The value of the minimum trim..."); 

    if (!availableSubMasterWidthSatisfiesAllPatterns(value)) 
     throw new CustomExceptions.InvalidTrimValue("Another message..."); 

    _minimumTrim = value; 
} 

このアプローチのための私のロジック(にこれを回すことなく、議論「の例外をスローするとき」を)単にビジネス・オブジェクトがビジネス・ルールの制約をチェックし、必要に応じてバブルアップして捕捉できる例外を投げることに責任があるということです。私のアプリケーションのUIでは、パブリックプロパティが設定されている値を明示的にチェックしています(ただし、フレンドリーなダイアログなどを表示するアクションを実行します)が例外をスローすると、私のビジネスオブジェクトたとえば、プロパティが別のビジネスオブジェクトによって設定されているなど、UIでは使用できません。とにかく皆さんは皆考えを得ると思います。

私の問題は、これらの例外がApplication.ThreadExceptionに接続されたハンドラで捕捉されていないということです。理由はわかりません。

他の読書から、私はApplication.ThreadExceptionイベントを実行し、ハンドラ "...はメインのGUIスレッドで発生する例外をキャッチします"。このスレッドに含まれていないビジネスオブジェクトで例外が発生していますか?私は新しいスレッドを作成していません。

私はコードを次のように更新すると、明快にApplication.ThreadExceptionに配線されたイベントハンドラを呼び出すことができます。これは、エンタープライズライブラリサンプルで概説されているアプローチです。 しかし、このアプローチでは、try catchにスローされた例外をすべてラップする必要があります。これは、最初に 'グローバル'ハンドラを使用して回避しようとしていたものです。

try 
{ 
    if (value > MaximumTrim) 
     throw new CustomExceptions.InvalidTrimValue("The value of the minimum..."); 

    if (!availableSubMasterWidthSatisfiesAllPatterns(value)) 
     throw new CustomExceptions.InvalidTrimValue("Another message"); 

    _minimumTrim = value; 
} 
catch (Exception ex) 
{ 
    Program.ThreadExceptionHandler.ProcessUnhandledException(ex); 
} 

私はまたAppDomain.UnhandledExceptionイベントにハンドラまでの配線を用いて調べているが、これはどちらかの例外をキャッチしません。

最初のコードサンプルでグローバル例外ハンドラが私の例外をキャッチしていない理由を誰かに説明できればいいと思います。私が行方不明の別のアプローチはありますか、上記の必要に応じてtry catchでコードをラップしていますか?

答えて

0

思想として、(かなり早い時期に - Mainの開始時にIE)を追加してみてください:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
言っ

- でたりすることなく、私のために正常に動作するようです...

+0

これを設定しても、状況は変わっていないようです。プロパティーセッターで発生する例外は、デバッガーで例外をスローしますが、引き続きその例外をスローすると、他の例外と同様にThreadExceptionイベントに入りません。 – Hagelt18

+0

この問題は、コントロールにバインドされたプロパティでのみ発生するように見えることに注意してください。したがって、文字列プロパティを作成してテキストボックスにバインドし、プロパティのセッターで例外をスローすると、問題を再現できるはずです。 – Hagelt18

0

MSDNによれば、例外が処理されない場合にのみApplication.ThreadExceptionが発生します。おそらく、例外を処理しているコールスタックのどこかにcatchがありますか?

もう1つの方法は、AppDomain.UnhandledExceptionを代わりに使用することです。同じAppDomainのすべての例外に対して機能する点を除いて、Application.ThreadExceptionと同じです。

0

あなたが使用 Application.ThreadException または AppDomain.CurrentDomain.UnhandledException デバッガますキャッチ例外を使用しようとします!

これらのメソッドをテストするには、デバッガーなしでアプリケーションを起動する必要があります。

+0

デバッガが例外をキャッチすると、ThreadExceptionまたはUnhandledExceptionイベントまでの例外バブルを確認するために、「続行」(またはVS内のF5)を押す必要があります。 – Hagelt18