2
假設我在C++程序中,我想將這些報告轉換爲異常。使用C++ throw語句是否合理,或者我堅持重定向到stderr?我可以從_CrtSetReportHook拋出異常嗎?
假設我在C++程序中,我想將這些報告轉換爲異常。使用C++ throw語句是否合理,或者我堅持重定向到stderr?我可以從_CrtSetReportHook拋出異常嗎?
不,你不能從你的鉤子拋出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);
}
誰應該抓住它?它通常會在main()返回後調用。這是一個調試功能,你運行在一個良好控制的環境中。 –
我主要想到像ASSERT [E]這樣的調用,它們很少在main()之外。 –
這不是一個投擲。可以有很多*,很快變老。默認處理程序有什麼問題? –