2011-08-05 5 views
2

私がC++プログラムを使用していると仮定して、これらのレポートを例外に変換したいと考えています。私はC + +スロー文をそれを行う合理的な方法を使用している、または私はstderrにリダイレクトしてスタックですか?_CrtSetReportHookから例外をスローすることはできますか?

+0

?これは通常、main()が返された後に呼び出されます。これはデバッグ機能であり、適切に管理された環境で実行しています。 –

+0

私は主にmain()の外側にあるASSERT [E]のような呼び出しを主に考えています。 –

+0

それはスローではありません。彼らの*ロット*があり、すぐに古いものになることがあります。デフォルトのハンドラで何が問題になっていますか? –

答えて

2

いいえ、あなたのフックからC++例外をスローすることはできません。

フックが呼び出されるとCRTが不確定な状態になり、例外をスローまたは処理できなくなることがありますが、一般的には時間がかかることがあります。 CRTに問題があるときに例外を投げることは、例外のためにスタックの巻き戻し中に呼び出されたオブジェクトのデストラクタから例外をスローするのと同じシナリオです。また、CRTの深さはC++の例外をスローするのに適切な場所ではないため、ランタイムを悪い状態にする可能性があります。あなたは何をすべき

は以下の通りです:

それをキャッチすることになっている
int no_dialog_box_but_act_as_if_it_had_appeared_and_abort_was_clicked (int /* nRptType */, 
                     char *szMsg, 
                     int * /* retVal */) 
{ 
    fprintf (stderr, "CRT: %s\n", szMsg); 

    /* raise abort signal */ 
    raise (SIGABRT); 

    /* We usually won't get here, but it's possible that 
    SIGABRT was ignored. So exit the program anyway. */ 
    _exit (3); 
} 
関連する問題