您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++不能拋出異常怎么解決”,在日常操作中,相信很多人在C++不能拋出異常怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++不能拋出異常怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
E.25:如果不能拋出異常,模仿RAII方式進行資源管理
即使不和異常一起使用,RAII通常是最好的,最系統化的處理資源的方式。
Note(注意)
使用異常的錯誤處理是C++中完全、系統化處理非局部錯誤的唯一方式。通常,非侵入式發出錯誤信號以便構造一個對象需要使用異常。以無法忽視的方式發出錯誤信號需要異常。如果你無法使用異常,盡你所能模擬它。
很多關于異常的大量恐懼都是被誤導的。當在沒有被指針或復雜的控制結構搞亂的代碼環境中使用異常時,異常處理幾乎總是可以接受的(無論是時間還是空間維度),幾乎總是可以帶來更好的代碼。當然,想象一個異常處理機制的良好實現,它不存在于任何系統。還是存在不屬于上述問題,但由于其他原因而不能使用異常的情況。某些硬實時系統就是例子之一:一個操作必須在固定時間內完成并得到正確或錯誤的結果。如果沒有適當的時間評價工具,異常很難滿足這個要求。這樣的系統(例如飛行控制系統)通常也會禁止使用動態(堆)內存。
因此,關于錯誤處理,主要的準則是“使用異常和RAII”。這個部分內容處理以下情況:要么你無法獲得異常的高效實現,要么你的代碼是老鼠窩一樣的舊代碼(例如,大量的指針,病態定義的所有權,大量的基于測試錯誤的非系統化錯誤處理),這時無法引入簡單和系統化的異常處理。在譴責異常或抱怨異常的成本過高之前,考慮使用錯誤代碼時的成本和復雜度。如果你擔心性能,進行測量(而不是無根據的懷疑,譯者注)。
Example(示例)
假設你想編寫如下代碼:
void func(zstring arg)
{
Gadget g {arg};
// ...
}
如果gadget無法正確構建,func會因為異常退出。如果你無法拋出異常,我們可以通過給Gadget增加一個valid成員函數來模擬RAII風格的資源管理。
error_indicator func(zstring arg)
{
Gadget g {arg};
if (!g.valid()) return gadget_construction_error;
// ...
return 0; // zero indicates "good"
}
這里的問題當然是調用者必須記得檢查返回值。
Enforcement(實施建議)
可能(僅僅)適用這個想法的特定版本:例如,在資源句柄構建之后系統化檢查valid()。
到此,關于“C++不能拋出異常怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。