DOBON.NET DOBON.NETプログラミング掲示板過去ログ

集約例外でエラーが拾えない

環境/言語:[Windows7/VS2008]
分類:[.NET]

こんにちは。
お世話になります。

Application.ThreadException、GetDomain().UnhandledExceptionの2つの
ハンドラを使用して、集約例外を実装していますが、クラスライブラリ内で
発生したエラーを拾ってくれません。
おそらく上記の方法では拾うことは無理なのでは無いかと思っていますが、
何か方法があるのでしょうか?
もしくは別の集約例外の方法なら拾うことができるのでしょうか?

よろしくお願いします。
「拾えない」とは結果としてどういう状態になりますか?
アプリケーションが落ちるのか、ハンドルされていない例外として止まるのか、そのあたりの情報を出していただけないと、何が問題なのか見えづらいです。

なお、デバッグ実行ではなく、exe から実行した場合にうまく動くのであれば、デバッガの仕様による動きの差の可能性もあります。
返信ありがとうございました。


1点勘違いをしておりました。
クラスライブラリは関係有りませんでした。
フォームロードのイベントの中で発生した例外が集約例外で処理出来ませんでした。

具体的には、ボタンクリックイベントにThrow New Exception()を記述した場合は、
ThreadException、UnhandledExceptionで登録したプロシージャが実行されます。
しかし、フォームロードイベントにThrow New Exception()を記述した場合は、
集約例外処理用のプロシージャは実行されませんでした。
また、Throw New Exception()の箇所で止まることもありません。
単純にフォームロードを抜け次のイベントが実行されるだけでした。

上記動作はデバッグ時の動作です。
ご指摘が有りました通り、exeから実行した際には、フォームロードの際の
エラーも集約例外として処理出来ました。

言われている通りデバッガの仕様のような気もしますが、
どうにか集約例外として処理出来ないかと思います。
なぜかと言うと、デバッグしながら画面を作成している訳ですが、
想定している動作と異なるが、エラーメッセージも出ない、処理が止まることも無いため
いかにも処理が正常しているように思えてしまい、原因を見つけるのに時間がかかって
しまったためです。

よろしくお願いします。
■No31624に返信(netfanさんの記事)
> 言われている通りデバッガの仕様のような気もしますが、
> どうにか集約例外として処理出来ないかと思います。

残念ながらできません。
デバッガをアタッチして実行しているときと、それ以外の時では Form の ShowDialog であるとか、Application.Run であるとか、この外に例外がスローされるかどうかで振る舞いが違います。
Load イベントの件はこの振る舞いの違いから起きているのかもしれませんね。

Application.ThreadException のところを違う処理にすることによって、デバッガはハンドルされていない例外の検出とブレークを実現していると思われます。
このような事情からか、通常のデバッグではこの処理を取り除くことはできません。
無理矢理に近いことをやるとすれば、デバッグなしで実行してから後からそのプロセスにデバッガをアタッチすることです。この場合、一部のデバッグの機能は有効に動作しない可能性があります。(ハンドルされていない例外でブレークできないなど)


> なぜかと言うと、デバッグしながら画面を作成している訳ですが、
> 想定している動作と異なるが、エラーメッセージも出ない、処理が止まることも無いため
> いかにも処理が正常しているように思えてしまい、原因を見つけるのに時間がかかって
> しまったためです。

基本的には集約例外を積極的に使うような設計を避けることが理想だと私は考えています。
あくまで最終手段(予期しない例外に対するロギングなど)としてとらえて、通常は try-catch でうまくハンドリングした方が、デバッグ時とそれ以外の時の差を生まずに済みます。

もしくは、Load イベントで例外が発生したときの振る舞いの違い、Form.ShowDialog/Application.Run の外側で catch することができる・できないの振る舞いの違いを受容、認識して行動されるかです。
2013/06/10(Mon) 16:50:25 編集(投稿者)
2013/06/10(Mon) 16:50:23 編集(投稿者)

今回はシステム改修のため、例外処理の方法を変更することは無理ですが、
次回からはtry-catchを明示的に記述することも検討したいと思います。

大変勉強になりました。
Azulean様ありがとうございました。
解決済み!
2013/06/10(Mon) 18:03:46 編集(投稿者)

■No31624に返信(netfanさんの記事)
> フォームロードのイベントの中で発生した例外が集約例外で処理出来ませんでした。

お使いの Win7 は x86 でしょうか、x64 でしょうか?


今回の現象(ThreadException/UnhandledException での集約)に
関係しているかどうかは分かりませんが、64bit OS において、Visual Studio が
Load イベントの例外を拾うことができない現象が知られています。
(Shown などでの例外は拾えるのですが)
http://rucio.cocolog-nifty.com/blog/2011/04/post-f125.html
http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/69a0b831-7782-4bd9-b910-25c85f18bceb/
解決済み!
x64です。

>http://rucio.cocolog-nifty.com/blog/2011/04/post-f125.html
集約例外では処理されませんでしたが、
今までスルーだったのが、エラー箇所で
止まってくれるようになりました。

これだけでも格段に開発がしやすくなります。

DOBON.NET | プログラミング道 | プログラミング掲示板