2012-08-27 19 views
3

我有一個奇怪的事件發生,我還沒有能夠堅持。什麼可以重寫main()的返回碼?

我有測試用例應該會捕獲錯誤並從main返回相應的錯誤代碼,但是/有時/在測試運行時,即使錯誤代碼爲非零,程序也會返回0。

引發的異常類是:

class exit_request { 
public: 
    explicit exit_request(int code = 0) : m_code(code) {} 
    int code() const { return m_code; } 
private: 
    int m_code; 
}; 

測試用例代碼:

int main(int argc, char* argv[]) 
{ 
    try { 
     // Do some test case stuff 
     // Eventually, due to the supplied command line arguments, 
     // we expect an exit_request() to be thrown from within 
     // library code.  
    } 
    catch (exit_request& exp) { 
     std::cout << "Exit Request:" << exp.code() << std::endl; 
     return exp.code(); 
    } 
    catch (std::exception& err) { 
     std::cout << "Error: " << err.what() << std::endl; 
     return EXIT_FAILURE; 
    } 

    return EXIT_SUCCESS; 
} 

在此測試情況下多次運行,一切正常:該exit_request()拋出異常,被捕獲,exp.code()被打印出來(它的值是2),並且來自進程的返回代碼是2.

然而,偶爾,進程的返回代碼是0(即沒有失敗) ,即使exp.code()打印爲2.

任何人都可以幫助解釋這種情況可能發生嗎?即在進程退出之前,main的返回值從非零變爲零?

這發生在Windows 7(x64)上,使用MSVC++ 2010 Express構建x86(32位)應用程序。我還沒有在其他任何Windows或Linux平臺或編譯器上看到過這種奇怪的失敗,但這並不一定意味着它在這些環境中不會發生。

+1

嘗試添加一個catch(...)'以確保捕獲所有異常 –

回答

0

也許你沒有正確地拋出異常... 我的意思是說,從函數調用或處理在try塊中完成,你拋出一些其他類型的異常。 試着爲此寫一個default catch block

+0

肯定會拋出並捕獲正確的異常 - 在catch_request中有一個print_request,我可以看到它被打印到stdout。無論如何感謝您的建議。 –

1

如果您有任何呼叫exit(0)atexit處理程序或任何析構函數執行此操作的靜態存儲持續時間對象,它可能會解釋您所看到的內容。他們在您的return聲明後執行。這是未定義的行爲,這可以解釋爲什麼有時只看到它發生。

+0

謝謝。這可能是,我會進一步調查。 –

+0

嗯不幸的是,我們沒有任何活動的atexit()函數,這意味着它可能在靜態對象析構函數中。我查看了代碼中最明顯的代碼,但它們似乎被稱爲罰款,即使在返回代碼最終爲0(預計爲2)的運行中。無論如何,我可能在某個地方錯過了一些東西。 –

+0

你可以觀察這個內部?使用你的調試器。在ExitProcess上設置一個斷點,看看你如何到達那裏。 –

相關問題