2016-11-11 66 views
1

在我們的代碼庫中,我們不使用C++異常,意思是「-fno-exceptions」在gcc編譯選項中(請注意這是我們公司的政策,所以不需要爭論)。然而,在這種情況下,如何從引發異常的標準庫中檢查構造函數的失敗。我已經閱讀了一些SO帖子,但仍然沒有明確的想法。例如,在C++ 11中,std::regex("pattern") 可以拋出regex_error異常。如果我有下面的代碼:如何檢查構造函數失效,例外情況禁用

class Wrapper { 
public: 
    bool create(std::string pattern) { 
     try { 
     m_regex = std::regex(pattern); 
     m_state = true; 
     } catch (std::regex_error& e) { 
     //handle error case 
     m_state = false; 
     } 
    } 
private: 
    std::regex m_regex; 
    bool m_state; 
} 

注: m_regex = std::regex(pattern);

將調用

explicit basic_regex(const CharT* s, flag_type f = std::regex_constants::ECMAScript) 

會拋出異常和移動賦值運算符現在

basic_regex& operator=(basic_regex&& __rhs) noexcept 

,沒有選擇使用異常,我們如何檢查失敗o f std :: regex的構造函數?

class Wrapper { 
public: 
    create(std::string pattern) { 
     m_regex = std::regex(pattern); 
     // now, how to check? 
     // if (m_regex)? 
     m_state = true; 
    } 
private: 
    std::regex m_regex; 
} 

我沒有找到在std :: regex中有任何狀態可以指示失敗。

選項1:我可以假設如果正則表達式構造函數失敗,會發生abort(),那麼下面的語句m_state = true將不會被執行?我查了一下,看起來abort()通常發生在異常啓用的情況下,但沒有使用catch。所以這是錯誤的。

選項2:我可以使用std::regex* ptr_regex = new std::regex("pattern"),檢查ptr_regex的NULL的含量?

+2

你不能。如果你不允許使用異常(即使只是爲了捕獲),你必須避免使用STL。 – Gonmator

+0

正如@Gonmator所說的,除了它不僅僅是STL:你必須避免大部分C++標準庫的每個部分,特別是正則表達式。 –

+1

對於「我們公司不允許例外」的一個很好的解決方案,除非是因爲非常好的原因,例如資源非常低的嵌入式編程,或者處理遺留代碼庫(這是谷歌的方式),是如果可能的話,在別處找工作。因爲,一個由不稱職者制定的重要政策,其餘的可能就是一樣糟糕。例如,同樣適用於例如首席執行官表示缺乏職業道德指南針:這可能影響了幾乎所有的組織。 –

回答

2

這是一個有些未解決的問題和one of the big open problems discussed by SG14,在「低延遲」研究小組委員會。

至於標準而言,這簡直是不確定的。例外情況不是可選的,並且未指定如果將它們關閉,會發生什麼情況。因此標準庫通常不提供處理錯誤的替代方法。目前在將來的提案中有一種趨於減輕這種情況的傾向。例如,當前的文件系統TS具有非拋出重載,它會爲可能拋出異常的所有函數返回一個錯誤碼。以類似的方式爲現有的標準庫設施提供非拋棄替代方案也是可能的,但這正是SG14試圖找出的結果。

截至目前,重要的問題是:是什麼,如果遇到編譯器做throw有例外編譯時禁用(或try/catch)?如前所述,該標準根本沒有說明這一點,因此這裏的任何解決方案都必須是不可移植的。有機會,你將無法通過throw來發現或恢復庫中指示的錯誤,所以如果你不能預先排除拋出異常,你可能想要避免拋出函數(因此,大部分標準庫)。

希望這種情況在未來會有所改善。

+0

是的,我們真的被困在這。但是我們不得不尋找一些解決方案或解決問題,因爲我們或我們的客戶不能等待委員會。 – pepero

+0

@pepero我感到你的痛苦。您可能希望留意其他實現。由於這個原因和其他原因,許多供應商已經提出了他們自己的標準庫設施的實現。 '嵌入式STL'是互聯網搜索的一個很好的起始關鍵字。有時候Boost會提供額外的保證。不幸的是,我不知道任何'std :: regex'的實現可以解決你的問題。 – ComicSansMS

0

創建,其目的是包裝異常,需要std實用程序庫。

此庫編譯並啓用了異常。

它或者存儲相當於optional<std::regex>(例如)。它提供可能失敗的構造函數(在庫的.cpp內)調用構造函數,然後嘗試/ catch並將失敗轉變爲空的regex

如果還有其他可以拋出的操作,它將它們包含在具有錯誤返回路徑的方法中。也許他們會返回std::experimental::expected<T, error_information>

您必須小心ODR並鏈接此庫和用異常禁用的std庫編譯的代碼,因爲它們之間的內聯函數會有所不同。我現在不詳細說明如何避免這個問題。

從我可以從一個非常快速的谷歌,膨脹和從一個圖書館啓用例外應該是主要限制與該圖書館的規模擴大。測試這個。

相關問題