2016-01-20 25 views
4

好的,如果我使用RAII語言來管理某些上下文屬性*,如果我在try區塊的開始處裸露地使用它,它是否會像我預期的那樣工作?關於RAII,C++`try` /`catch`塊是否與其他塊相同?

換句話說,如果我有這樣的:

struct raii { 
    raii() { 
     std::cout << "Scope init" 
        << std::endl; } 
    ~raii() { 
     std::cout << "Scope exit" 
        << std::endl; } 
}; 

...,我成功地使用它是這樣的:

{ 
    raii do_the_raii_thing; 
    stuff_expecting_raii_context(); 
    /* … */ 
} 

...將RAII實例相同的方式工作,如果我這樣做:

try { 
    raii do_the_raii_thing; 
    stuff_expecting_raii_context_that_might_throw(); 
    /* … */ 
} catch (std::exception const&) { 
    /* … */ 
} 

這可能是一個愚蠢的問題,但我想檢查一下自己的理智 - 我對模糊不清他微妙的noexcept擔保,以及其他異常相關的細節 - 所以請原諒我的天真


[*]對於那些好奇,這是Python的C-API的,我有RAII管理邪惡的GIL(全局解釋器鎖) ,在我的具體情況下

+0

呵呵,這聽起來像它涉及例外(或至少它_can_) - 但我認爲你指的是這個問題解釋:http://stackoverflow.com/q/161177/298171 ...是? – fish2000

+0

哎呀,我回復的評論已經消失了! – fish2000

回答

3

「......將RAII實例相同的方式工作,如果我這樣做:......」

肯定他們會的。 RAII實例將超出範圍,並且在catch之前調用析構函數(如果引發異常)。

此外,這將適用於任何上層,即調用你的功能,如果你只是throw和沒有任何try/catch塊。這就是所謂的stack unwinding

5

是的,它會做你想要的:首先釋放RAII資源,然後處理異常塊。

2

是的,這在Standard指定:

15.2構造和析構[except.ctor]

2析構函數被調用,因爲構造類類型 的每個自動對象try塊已輸入。自動對象 按其完成 構造的相反順序銷燬。