2015-06-23 46 views
1

我正在寫一個類與std::regex成員除外:趕上從類成員初始化「就地」

class aaa { 
    std::regex re {"aaabbb"}; 
public: 
    aaa() {} 
    ... 
}; 

std::regex可以拋出一個std::regex_error如果傳入的字符串不是一個有效的正則表達式。在C++ 11/14中有沒有一種技術可以在類中捕獲這個異常?

與此類似:

class aaa { 
    std::regex re; 
public: 
    aaa() 
    try 
     : re("aaabbb") { 
    } 
    catch(...) { 
    } 
}; 
+2

後一種方法有什麼問題?這是一個[完全可以接受的方式](https://stackoverflow.com/questions/160147/catching-exceptions-from-a-constructors-initializer-list)來捕捉異常。 – CoryKramer

+0

@CoryKramer這不是他正在尋找的成員初始值設定項。 –

+0

第二種方法是可以接受的,我只是想了解 - 新的標準允許在成員聲明中進行初始化,但是對於這種方式,不會執行任何異常處理的步驟? – amigo421

回答

3

實際上,你不能趕上沒有重新拋出(這是隱含的)例外,如果在初始化列表中出現了異常:

include <stdexcept> 

struct E { E(int) { throw std::runtime_error("E"); } }; 
class A { 
    E e {1}; 
public: 
    A() 
    try 
    {} 
    catch(...) { 
     std::cout << "Exception" << std::endl; 
    } 
}; 
int main() 
{ 
    A a; 
    return 0; 
} 

給出:

Exception 
terminate called after throwing an instance of 'std::runtime_error' 
    what(): E 
Aborted 

但是,你能趕上它甚至沒有提到初始化列表中的成員。因此,您可能有成員的異常安全初始化,並且在構造函數體內處理異常關鍵的賦值/初始化(如其他(已刪除)答案建議的那樣)。

+0

你的意思是說,在初始化過程中代替聲明的異常將會像你寫的那樣在ctor中被捕獲?讓我檢查一下,我不能相信這個 – amigo421

+0

@ amigo421是的,這就是示例顯示 –

+0

對於在ctor體內處理的情況,你的E類應該有默認的ctor(用於聲明這是A的記憶) ,但是 - 如果E的缺省ctor存在相同的代碼 - 拋出異常,則不能在Ctor體中完全追趕並再次重新拋出 – amigo421

1

有可能是做一個華麗的方式,但我只希望有std::regex re;聲明爲一個類的成員變量,並嘗試在默認初始化和/或其他構造函數。然後你可以在構造函數中處理異常。