Предполагая, что я работаю в программе на C++, я хочу преобразовать эти отчеты в исключения. Является ли использование оператора throw C++ разумным способом сделать это, или я застрял, просто перенаправляя на stderr?
Могу ли я создать исключение из _CrtSetReportHook?
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