簡體   English   中英

如何避免在C ++中使用異常?

[英]How can I avoid using exceptions in C++?

我可以使用哪些技術來避免C ++中的異常,如Google的樣式指南中所述

  1. 不要拋出異常。
  2. 不要使用STL(它嚴重依賴於例外)。
  3. 僅使用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

在某些編譯器中,您可以關閉異常處理。 這可能會導致外部代碼出現意外結果 - 這不是我想要嘗試的。

除此之外,顯而易見的第一步是避免從您自己的代碼中拋出異常,可能是通過自由使用nothrow指令 ,並嘗試通過防御性編程來避免從外部(第三方)代碼中拋出異常。

這意味着您的代碼需要始終了解可能的外部異常故障情況,例如內存不足,磁盤空間不足,Internet連接丟失,硬件故障以及可能導致代碼的任何其他情況。扔...

在某些情況下,您可以使用某些代碼的無異常版本(例如throw-new與非throw new)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM