VC++2005 SDK(ネイティブ)
例外処理で困っています。
全ての例外を捕まえたいので、try〜catch(...)を使用しています。
しかし上記のようにすると例外の詳細が分かりません。
例えばゼロで除算した場合は、デバッグウィンドウに
初回の例外が発生しました: 0xC0000094: Integer division by zero
と表示されます。このようなエラーの種類、
どんなエラーが起きたのか知りたいのです。
.NETフレームワークの例外処理ならば可能なようですが、
訳あってフレームワークは使えません。
catch(...)と記述してエラーの種類を取得する事は不可能なのでしょうか。
どうか、宜しくお願いします。
> catch(...)と記述してエラーの種類を取得する事は不可能なのでしょうか。
エラーの詳細を格納するグローバル変数を用意しておいて、
例外throw直前にセットし、catch側で読みだせばいい。
throw側に手を加えることができないなら無理。
試していないけど、↓これ使えるかもしれません
AddVectoredExceptionHandler
> catch(...)と記述してエラーの種類を取得する事は不可能なのでしょうか。
throwで投げることが可能なオブジェクトは例外に関連したものとは限らない(何でも投げることができる)。
従って何がthrowされるかがわかっていないと無理(と思う)。
throwされる可能性があるオブジェクトの型がわかっていれば、型チェックを
行うことで例外の種類がわかるかも知れないが、その場合、catch(型)で分け
ることと違いはない。
熱狂的な例外ファンの反論を交わす為、個人的な見解だと
断っておきます(笑)。自分は、
1.そもそも予測可能で回復可能なエラーに対して例外は使わない。
2.この場合catchされたほとんどの例外は詳細が不明です。
のようにコードします。これは、
A.遠方、または管理外の例外を捕捉してもほとんど何もできない。
B.局所的な例外予測範囲をtryするコードは、例外を使用しない
よりきめの細かい別のコードで置き換えられる。
という前提に基づきます。従って、
「全ての例外を捕まえたいので、try〜catch(...)を使用しています。」
という手法は、「アプリが落ちるのを防ぐ」には効果があるかも
知れませんが、「捕捉したエラーを回復する」ためにはあまりにも、
ざっぱな感じがします。
アドバイスありがとうございます。
みなさんの記述してある事を読みながら、
やっぱり例外はターゲットを明確にして個別にキャッチするべきだと感じました。
.NETの場合はcatch(Exception&e)とすることで
全ての例外を捕らえられるようなので、
ネイティブでも何かしらあるのではないかと幻想をいだいていました。
楽しようと考えていたのが間違いかと思います。
結論はスローされる例外を認識してそれに相応の例外処理を記述して行こうと思います。
アドバイスありがとうございました。