У меня есть приложение командной строки, написанное на C ++ и скомпилированное с Visual Studio 2015.
Мне нужно убедиться, что это приложение не блокируется диалоговыми окнами ошибок при автоматическом автоматическом функциональном тестировании, в частности, вслучай неудачных утверждений (стандарт assert()
из <cassert>
).
Сначала я думал, что следующий вызов, предложенный в https://stackoverflow.com/a/6925695/393756, выполнит эту работу, но не сделал:
_set_error_mode(_OUT_TO_STDERR);
Экспериментируя, я в конечном итоге обнаружил, что следующий код достигает ожидаемого эффекта, по крайней мере , когда дело доходит до неудачных диалогов подтверждения :
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
Вопросы:
Почему _set_error_mode(_OUT_TO_STDERR)
недостаточно?Если я правильно понимаю документацию , это должно произойти.
Почему не _CrtSetReportMode(_CRT_ASSERT)
(плюс связанный вызов _CrtSetReportFile()
)Достаточно ли отключить диалоги для утверждений?По-видимому, мне нужно также настроить _CRT_ERROR
.
Чтобы убедиться, что диалог никогда не открывается , я должен позвонить SetErrorMode()
, и если да, то с какими аргументами?
Должен ли я предпочесть SetThreadErrorMode()
?