Могу ли я создать исключение из _CrtSetReportHook?

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


person Matt Chambers    schedule 05.08.2011    source источник
comment
Кто должен ловить? Обычно он будет вызываться после возврата функции main(). Это функция отладки, вы работаете в хорошо контролируемой среде.   -  person Hans Passant    schedule 06.08.2011
comment
В основном я думаю о таких вызовах, как ASSERT[E], которые редко выходят за пределы main().   -  person Matt Chambers    schedule 06.08.2011
comment
Это не бросок. Их может быть много, быстро устаревает. Что не так с обработчиком по умолчанию?   -  person Hans Passant    schedule 06.08.2011
comment
@Hans Passant: В этом случае я запускаю модульные тесты. Когда я получаю отладочное утверждение, я хочу, чтобы оно обрабатывалось как любая другая ошибка, то есть исключение. Мне не нужен пользовательский диалог Abort/Retry/Ignore для приложения Windows и сообщение stderr для консольного приложения.   -  person Matt Chambers    schedule 07.08.2011


Ответы (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);
}
person user1976    schedule 04.03.2015