Можно ли сгенерировать исключение из _CrtSetReportHook?

Предполагая, что я нахожусь в программе на C++, я хочу преобразовать эти отчеты в исключения. Является ли использование оператора C++ throw разумным способом сделать это, или я застрял, просто перенаправляя на stderr?

1 ответ

Нет, вы не можете выбросить исключения 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);
}
Другие вопросы по тегам