В многопоточном приложении я использую следующий макрос 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()
? (Я не уверен в последствиях этого, поэтому я полностью открыт для различных вариантов)