Как изящно выйти из ошибки утверждения в многопоточном приложении

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


person kfmfe04    schedule 01.02.2012    source источник
comment
Да, сгенерировать исключение. Однако почитайте о распространении исключений в многопоточной среде.   -  person Kerrek SB    schedule 01.02.2012
comment
@KerrekSB - ty - начну гуглить по теме   -  person kfmfe04    schedule 01.02.2012
comment
@KerrekSB: проблема с созданием исключения заключается в том, что к моменту его перехвата контекст ошибки теряется, что затрудняет определение причины ошибки.   -  person Mankarse    schedule 01.02.2012
comment
@Mankarse: я думал, что сообщение об ошибке позаботится о распечатке необходимой контекстной информации.   -  person Kerrek SB    schedule 01.02.2012


Ответы (1)


Хотя это быстро и грязно, _exit отлично работает на большинстве платформ.

person David Schwartz    schedule 01.02.2012
comment
+1 ty - похоже, это работает - не могли бы вы рассказать, что на самом деле происходит с _exit ()? (Я также буду гуглить) Я мог бы использовать этот вызов в других контекстах, если бы я мог понять его ограничения. - person kfmfe04; 01.02.2012
comment
Он выполняет полунемедленное, безусловное, безоговорочное завершение вызывающего процесса. - person David Schwartz; 01.02.2012