2

C++ プログラムを使用していると仮定して、これらのレポートを例外に変換したいと考えています。C++ の throw ステートメントを使用するのが合理的な方法ですか、それとも stderr にリダイレクトするだけですか?

4

1 に答える 1

4

いいえ、フックから 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);
}
于 2015-03-04T11:02:14.313 に答える