トップ回答者
マルチスレッドプログラムにおける例外処理

質問
-
お世話になっております。
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で取得したいのです。
対応方法が間違っているのだと思うのですが、
アドバイス頂ければ幸いでございます。以上、よろしくお願い致します。
回答
-
AggregateExceptionのInnerExceptionsプロパティでどうですか?
かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/- 回答としてマーク コンドル 2011年12月8日 4:42
すべての返信
-
AggregateExceptionのInnerExceptionsプロパティでどうですか?
かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/- 回答としてマーク コンドル 2011年12月8日 4:42
-
外池と申します。
あるスレッドで発生した例外を、そのスレッドをスタートさせた側のスレッドでキャッチすることを意図されているんですよね?
かなり難しい問題だと思います。
基本は、スレッド自身で例外をキャッチして状況を要約したデータを用意し、スタートさせた側のスレッドにデータを返すことかと思います。
Parallelは詳しいことを知りませんが、小生も少し実験したことがあります。
http://homepage3.nifty.com/numericworld/computer/dotnet/asyncexp.htmなんらかのヒントになれば幸いです。
(ホームページを再開しました) -
ループの中でcatchしてください。
ParallelForオーバーロードと ForEach オーバーロードには、スローされる可能性のある例外を処理する特別な機構はありません。
-
皆さま、ご回答ありがとうございました。
かずき_okazuki様に教えて頂いた通り、
AggregateExceptionのInnerExceptionsプロパティを使用したところ、
例外の発生元オブジェクトを取得することができました。
意図した動作を実現できております。佐祐理様に教えて頂いた内容を見ると、
InnerExceptionsを使用した対応だと問題があるかもしれないと感じますので、
もう少し検証し、問題があるようでしたら
ループの中でCatchして対応したいと思います。外池様から教えて頂いた内容も参考になりました。
ありがとうございました。