在多线程应用程序中,我使用以下ASSERT宏来捕获调试单元测试期间的编码和数据错误。
#ifndef NDEBUG
#define ASSERT(condition, message) \
do { \
if (! (condition)) { \
std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \
<< " line " << __LINE__ << ": " << message << std::endl; \
std::exit( EXIT_FAILURE ); \
} \
} while (false)
#else
#define ASSERT(condition, message) do { } while( false )
#endif
除了严重需要替换的讨厌的std::exit( EXIT_FAILURE );
之外,它基本上做了我需要的事情。在目前的形式中,我得到了双重删除和各种各样的肮脏,这使得断言信息变得模糊不清。
如何从多线程应用程序中的断言失败中优雅地退出?
也许我应该抛弃断言,然后catch + return(1)
来自main()
?
(我不确定这样做的后果,所以我完全愿意接受各种选择)
答案 0 :(得分:1)
虽然它很快且很脏,_exit
在大多数平台上都能正常运行。