none
マルチスレッドプログラムにおける例外処理 RRS feed

  • 質問

  • お世話になっております。
    C#2010で開発しています。

    マルチスレッドプログラムを作成しているのですが、
    例外をキャッチしても、例外の詳細が分からずに困っております。
    例外には次のように記録されます。

    System.AggregateException
    1 つ以上のエラーが発生しました。


    マルチスレッドプログラムは具体的にはParallel.ForEachを利用しています。
    例外はプログラムのエントリーポイントで次のように記載しています。
    ※実際にはログファイルに出力する処理も書かれておりますが、省略しています。


                System.AppDomain.CurrentDomain.UnhandledException +=
                    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);


            private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                Exception ex = (Exception)e.ExceptionObject;

                MessageBox.Show(ex.Message);
            }


    次のページを参考にして対応してみたのですが、
    この対応では例外の元を取得できないのでしょうか?

    @IT:.NET TIPS 適切に処理されなかった例外をキャッチするには? - C# VB.NET Windowsフォーム
    http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html


    exのInnerExceptionを取得しても、ほしい結果は得られませんでした。
    マルチスレッドプログラムの中で、データベースアクセスに失敗したのであれば、
    その旨のエラーや、エラーが発生したクラスをStackTraceで取得したいのです。


    対応方法が間違っているのだと思うのですが、
    アドバイス頂ければ幸いでございます。

    以上、よろしくお願い致します。

    2011年12月8日 1:41

回答

すべての返信

  • AggregateExceptionInnerExceptionsプロパティでどうですか?


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク コンドル 2011年12月8日 4:42
    2011年12月8日 1:48
  • 外池と申します。

    あるスレッドで発生した例外を、そのスレッドをスタートさせた側のスレッドでキャッチすることを意図されているんですよね?

    かなり難しい問題だと思います。

    基本は、スレッド自身で例外をキャッチして状況を要約したデータを用意し、スタートさせた側のスレッドにデータを返すことかと思います。

    Parallelは詳しいことを知りませんが、小生も少し実験したことがあります。
    http://homepage3.nifty.com/numericworld/computer/dotnet/asyncexp.htm

    なんらかのヒントになれば幸いです。


    (ホームページを再開しました)
    2011年12月8日 1:55
  • ループの中でcatchしてください。

    方法: 並列ループの例外を処理するから

    ParallelForオーバーロードと ForEach オーバーロードには、スローされる可能性のある例外を処理する特別な機構はありません。
    2011年12月8日 2:18
  • 皆さま、ご回答ありがとうございました。

    かずき_okazuki様に教えて頂いた通り、
    AggregateExceptionのInnerExceptionsプロパティを使用したところ、
    例外の発生元オブジェクトを取得することができました。
    意図した動作を実現できております。

    佐祐理様に教えて頂いた内容を見ると、
    InnerExceptionsを使用した対応だと問題があるかもしれないと感じますので、
    もう少し検証し、問題があるようでしたら
    ループの中でCatchして対応したいと思います。

    外池様から教えて頂いた内容も参考になりました。
    ありがとうございました。

    2011年12月8日 4:42