2012-02-01 47 views
3

在多線程應用程序中,我使用以下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()? (我不確定這樣做的後果,所以我完全開放各種選項)

+2

嗯。 '的std :: abort'? – 2012-02-01 07:21:02

+2

是的,拋出異常。不過,請閱讀多線程環境中的異常傳播。 – 2012-02-01 07:21:36

+0

@KerrekSB - ty - 我將開始在主題上使用Google搜索 – kfmfe04 2012-02-01 07:22:58

回答

1

雖然它很快速和骯髒,_exit完美地在大多數平臺上工作。

+0

+1 ty - 這似乎工作 - 你能詳細說明_exit()實際發生了什麼嗎? (我也會谷歌)如果我能理解它的侷限性,我可能會在其他上下文中使用此調用。 – kfmfe04 2012-02-01 07:40:11

+0

它會對調用進程進行半即時,無條件,無情的終止。 – 2012-02-01 07:45:47

相關問題