Можно ли сгенерировать исключение из _CrtSetReportHook? - PullRequest
2 голосов
/ 06 августа 2011

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

1 Ответ

2 голосов
/ 04 марта 2015

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