2012-08-24 24 views
1

我想要的時候,如果程序將失敗,它將被捕獲在這個處理程序,以便做一些警戒通知。C++中是否有一個catch-all-failures掛鉤?

是否有一個底部處理或者我需要爲了註冊,以確保程序不能沒有經過我的處理程序崩潰處理程序的列表?

在Ubuntu上運行和解決方案只需要到Ubuntu 我需要的一切有點像例外內存分配失敗的...

+0

將一個shell腳本,當它被殺死(無論原因)重新啓動程序是一個可接受的方法? – PypeBros

回答

2

簡單的回答是,有沒有單點你可以處理程序中的所有錯誤。您可以在main中添加try/catch (...)以處理在輸入main之後以及完成之前發生的異常。您還可以在C++中爲terminate添加處理程序。然後,根據操作系統的不同,您還需要以不同的方式處理其他情況(無效內存引用可以通過處理SIG_SEGV在unix/linux中處理,但在Windows中不起作用--AFAIK;其他一些錯誤可能觸發不同的信號,不會被處理......)此外,可能會有一些仍然不被注意的錯誤(比如發生無效的內存訪問,碰到有效的內存地址......程序將不正確,但錯誤可能不會被發現)

0

否。如果這個過程是kill版與SIGKILL,例如,不處理會跑。

P.S.僅供參考,這與SPOF無關。

+0

@cHao:我相信在之前的版本中沒有提到'SIGKILL'。刪除評論,因爲它不再適用。 –

2

C++不會在虛擬沙箱中運行,所以沒有什麼內置的語言來抓住這個。你當然可以自己創建一個(例如使用異常),但是從基礎開始構建它就取決於你的代碼。

你正在運行的平臺可能有你可以使用的東西。例如在Windows中有SetUnhandledExceptionFilter

當然,所有這些仍然取決於它意味着什麼「崩潰」。

1

在Linux中,您需要到SIGABRT響應信號。你callback將被調用時,您的應用程序變得SIGABRT信號

signal(SIGABRT, &callback); 

有不同的方案,如SIGSEGV,你定義掛鉤SIGBUS不同的信號。你最好在不同的回調中鉤住它們,並檢查哪些錯誤進入了什麼。因爲一個錯誤可能是由於多個問題。

+0

不要忘記用於段錯誤的'SIGSEGV'。 –

+0

和'SIGILL'和'SIGBUS' - 除此之外,完全正確。 – Damon

+0

它會覆蓋內存故障嗎? –

0

您可以在頂層放try/catch(...)塊捕獲所有異常。但是還有其他方法可以終止程序,並且捕捉這些程序的方式不可移植。在基於Unix的系統上,您必須創建信號處理程序,但即使這些處理程序也不會停止kill -9

+0

Try-catch句柄只有異常而不是失敗 –

+0

對於'try' /'catch',你還必須在創建的每個線程周圍放置這些句柄。 –

2

在進程啓動,調用fork。使用父母監控孩子。如果遇到致命錯誤,該過程將消失。你可以檢測到這一點,並在發生這種情況時做你需要做的任何事情。如果孩子希望正常終止,則可以在終止之前簡單地殺死其父母。

+0

+1,儘管我寧願使用進程退出值來確定正常/異常關機,而不是殺死父進程 – mitchnull

2

對於一個正常的程序退出,你可以用std::atexit()註冊的處理程序。

對於程序退出,因爲uncaught exceptions/...您可以註冊一個處理程序std::set_terminate。如果通過「異常內存分配」,你的意思是std::bad_alloc異常,應該觸發該處理程序。