我想要的時候,如果程序將失敗,它將被捕獲在這個處理程序,以便做一些警戒通知。C++中是否有一個catch-all-failures掛鉤?
是否有一個底部處理或者我需要爲了註冊,以確保程序不能沒有經過我的處理程序崩潰處理程序的列表?
在Ubuntu上運行和解決方案只需要到Ubuntu 我需要的一切有點像例外內存分配失敗的...
我想要的時候,如果程序將失敗,它將被捕獲在這個處理程序,以便做一些警戒通知。C++中是否有一個catch-all-failures掛鉤?
是否有一個底部處理或者我需要爲了註冊,以確保程序不能沒有經過我的處理程序崩潰處理程序的列表?
在Ubuntu上運行和解決方案只需要到Ubuntu 我需要的一切有點像例外內存分配失敗的...
簡單的回答是,有沒有單點你可以處理程序中的所有錯誤。您可以在main
中添加try/catch (...)
以處理在輸入main
之後以及完成之前發生的異常。您還可以在C++中爲terminate
添加處理程序。然後,根據操作系統的不同,您還需要以不同的方式處理其他情況(無效內存引用可以通過處理SIG_SEGV在unix/linux中處理,但在Windows中不起作用--AFAIK;其他一些錯誤可能觸發不同的信號,不會被處理......)此外,可能會有一些仍然不被注意的錯誤(比如發生無效的內存訪問,碰到有效的內存地址......程序將不正確,但錯誤可能不會被發現)
否。如果這個過程是kill
版與SIGKILL
,例如,不處理會跑。
P.S.僅供參考,這與SPOF無關。
@cHao:我相信在之前的版本中沒有提到'SIGKILL'。刪除評論,因爲它不再適用。 –
C++不會在虛擬沙箱中運行,所以沒有什麼內置的語言來抓住這個。你當然可以自己創建一個(例如使用異常),但是從基礎開始構建它就取決於你的代碼。
你正在運行的平臺可能有你可以使用的東西。例如在Windows中有SetUnhandledExceptionFilter
。
當然,所有這些仍然取決於它意味着什麼「崩潰」。
在Linux中,您需要到SIGABRT
響應信號。你callback
將被調用時,您的應用程序變得SIGABRT信號
signal(SIGABRT, &callback);
有不同的方案,如SIGSEGV
,你定義掛鉤SIGBUS
不同的信號。你最好在不同的回調中鉤住它們,並檢查哪些錯誤進入了什麼。因爲一個錯誤可能是由於多個問題。
您可以在頂層放try
/catch(...)
塊捕獲所有異常。但是還有其他方法可以終止程序,並且捕捉這些程序的方式不可移植。在基於Unix的系統上,您必須創建信號處理程序,但即使這些處理程序也不會停止kill -9
。
Try-catch句柄只有異常而不是失敗 –
對於'try' /'catch',你還必須在創建的每個線程周圍放置這些句柄。 –
在進程啓動,調用fork
。使用父母監控孩子。如果遇到致命錯誤,該過程將消失。你可以檢測到這一點,並在發生這種情況時做你需要做的任何事情。如果孩子希望正常終止,則可以在終止之前簡單地殺死其父母。
+1,儘管我寧願使用進程退出值來確定正常/異常關機,而不是殺死父進程 – mitchnull
對於一個正常的程序退出,你可以用std::atexit()
註冊的處理程序。
對於程序退出,因爲uncaught exceptions/...您可以註冊一個處理程序std::set_terminate
。如果通過「異常內存分配」,你的意思是std::bad_alloc
異常,應該觸發該處理程序。
將一個shell腳本,當它被殺死(無論原因)重新啓動程序是一個可接受的方法? – PypeBros