2011-08-05 100 views
2

假設我在C++程序中,我想將這些報告轉換爲異常。使用C++ throw語句是否合理,或者我堅持重定向到stderr?我可以從_CrtSetReportHook拋出異常嗎?

+0

誰應該抓住它?它通常會在main()返回後調用。這是一個調試功能,你運行在一個良好控制的環境中。 –

+0

我主要想到像ASSERT [E]這樣的調用,它們很少在main()之外。 –

+0

這不是一個投擲。可以有很多*,很快變老。默認處理程序有什麼問題? –

回答

2

不,你不能從你的鉤子拋出C++異常。

它可能在某些時候有效 - 但總的來說 - 當鉤子被調用時,CRT處於不確定狀態,並且可能不再能夠拋出或處理異常。當CRT遇到問題時拋出異常,類似於從堆對象的析構函數中拋出異常的情況,這是由於異常導致在堆棧展開期間調用的。此外,CRT的深度並不適合拋出C++異常,這樣做可能會使運行時處於不良狀態 - 如果還沒有的話!

你應該做的是:

int no_dialog_box_but_act_as_if_it_had_appeared_and_abort_was_clicked (int /* nRptType */, 
                     char *szMsg, 
                     int * /* retVal */) 
{ 
    fprintf (stderr, "CRT: %s\n", szMsg); 

    /* raise abort signal */ 
    raise (SIGABRT); 

    /* We usually won't get here, but it's possible that 
    SIGABRT was ignored. So exit the program anyway. */ 
    _exit (3); 
} 
相關問題