2016-11-15 77 views
0

我有一箇舊的基於C的項目,我想從Atmel處理器移植到Raspberry Pi。如何在C++異常處理中包裝我的C代碼?

在編寫它的時候,C++不是一個選項,而且將它全部轉換爲C++會花費太多精力,幾乎是一次重寫。

一些問題/崩潰不能(容易)被C抓住,所以有時候我的程序會死掉&我希望在失效前發出最後的求救聲。沒有嘗試恢復,我甚至可以生活沒有錯誤的細節,只要我得到一個消息告訴我訪問設備

長話短說,我認爲如果我有例外,我可以有更好的錯誤檢測處理。

我在考慮使用異常處理作爲提醒我去設備並獲取完整錯誤日誌,重置硬件等等的機會。如果我的C不會總是給我最後的喘息機會,代碼變得很大

因爲我不想做一個完整的C++重寫,是否僅僅將main()換成try/catch

技術上是否足夠,還是我需要做更多?

除了更詳細的錯誤報告,有沒有什麼可以通過將每個(主要)功能包裝在它自己的try/catch

+2

異常由'throw'語句拋出。 Seg錯誤不需要拋出異常;他們是未定義行爲的症狀。 –

+1

分段錯誤不保證被try/catch(...)捕獲。 實際上,即使您指定了C樣式處理程序,也不應在分段錯誤後繼續。 我建議你只需在每個C函數週圍添加try/catch,並進行廣泛的日誌記錄並希望獲得最佳效果! – Rami

+0

請忘記我曾經說過seg故障(但是+1,兩者);這是一個不好的例子,我將它從問題中刪除(我檢查NULL參數,但可能不會在每次解除引用前檢查NULL)。但是,@PeteBecker,異常不會從'throw'中產生,這就是我想要趕上的 – Mawg

回答

1

除了更詳細的錯誤報告,有沒有什麼可以通過將每個(主要)函數包裝在自己的try/catch中獲得?

首先,只有抓到你在哪裏,在一個位置的異常改變程序的行爲響應他們(除非你只是希望通過std::throw_with_nested()添加更多的上下文信息)

其次,AC程序不會顯示RAII,所以在這種情況下拋出異常很可能會泄漏資源,除非您將所有的句柄和內存分配包含在智能指針或啓用RAII的句柄類中。

你應該這樣做,然後再考慮添加異常處理。

如果程序可能會在未來積極維護,那麼這樣做可能會有里程。如果不是,可能最好留下睡覺的狗躺下。

+0

有一些好點(+1),但正如我所說的,我只是想要一個最後一次發送HTPP或TCP消息的機會,或者SMS或電子郵件。基本上,不只是*** *** ***,而是給予最後的喘息,然後死亡 – Mawg

+1

你最好的選擇可能是一個信號處理程序(在類Unix系統上)或窗口上的結構化異常處理。 –

+0

哇!信號處理程序很好!我怎麼錯過了?因爲這個原因,剛剛完成了信號處理工作。隨意發佈作爲(其他)答案 – Mawg