[英]How can I avoid using exceptions in C++?
new(std::nothrow)
或override ::operator new
在失敗時返回0。 請注意,通過避免異常,您實際上會丟棄許多有用的庫,包括Boost。 基本上,你必須從頭開始編程。
不在您自己的代碼中拋出異常相對容易:您只是不使用throw
語句。
不拋出內存分配失敗的異常會更加痛苦:要么你不使用普通的new
(使用new(std::nothrow)
或malloc
或者其他東西),要么你使用一些非標准的編譯器選項讓它做某事當它失敗時非標准(例如,立即終止你的程序,或者返回0
),或者當它失敗時你覆蓋operator new
來做一些非標准的事情。
如果您選擇的方法是立即終止程序,您可以使用set_new_handler()
實現這一點,我忘記了這一點,直到litb提醒我。
這就留下了處理由你不維護的C ++庫生成的異常的問題。 通常,您必須在一個看起來像這樣的包裝器中包裝庫調用:
int DoSomething(int &output, const int input) throw() {
try {
output = library_do_something(input);
return 1;
} catch (...) {
return 0;
}
}
catch (...)
捕獲來自library_do_something
所有可能的C ++異常(以及output
的賦值運算符,這里不相關),拋棄它們可能包含的所有信息,然后將所有這些失敗映射到0
。
請注意,這種風格意味着你根本不能使用RAII,甚至不能使用RAII,因為你無法在構造函數中發出信號失敗的信號。 RAII的重點在於您獲取構造函數內的所有資源,以便在異常傳播期間由析構函數正確釋放它們。 但資源獲取本質上總是會失敗。 所以你不能在構造函數中做到這一點。
我很想知道為什么人們會想要避免C ++中的異常以及用什么機制代替它們來處理意外故障的現實,同時仍然保持良好的結構。
確保將它們添加到不使用RAII類型語義的現有代碼庫中是非常昂貴的 - 但如果正在進行綠色領域開發,那么您會建議什么樣的替代方案以及如何證明不使用使用異常的高質量庫的理由編寫自己的異常免費/無bug替代品?
樣式指南說它們“不使用異常”就是這樣 - 它們不拋出它們並且不會調用任何可能拋出它們的東西(例如,它們會使用new(std::nothrow)
而不是通常是new
因為后者在無法分配內存時會拋出bad_alloc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.