【发布时间】:2018-12-23 22:39:03
【问题描述】:
我有一个用 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)不够用?如果我正确理解documentation,它应该是。为什么
_CrtSetReportMode(_CRT_ASSERT)(加上相关的_CrtSetReportFile()调用)不足以禁用断言对话框?显然我还需要配置_CRT_ERROR。为了确保没有打开任何对话框,我应该调用
SetErrorMode(),如果是的话,使用什么参数?我应该更喜欢
SetThreadErrorMode()吗?
【问题讨论】:
-
您所说的与文档相符,但与我的经验不符。以下program 使用带有控制台子系统的 VS 2015 工具集和多线程调试 DLL 运行时使用 VS 2017 编译,尽管调用了
_set_error_mode(_OUT_TO_STDERR),但确实显示了一个对话框。