2016-07-22 75 views
2

我在try/catch塊中創建了我的類的一個對象,並且想要在異常情況下在catch塊中訪問它。即使對象創建正常,我也無法在catch塊中訪問它,因爲它在塊之外聲明。如何在Try中聲明變量並在Catch中訪問它?

try { 
    MyObject ob(arg1,arg2); //this can trow exception 

    ob.func1(); //this also can throw exception 

} catch (std::exception& ex){ 
    //I want to access ob here if it was constructed properly and get the reason why func1() failed 
} 

我可以使用嵌套的try/catch塊來解決這個問題,但沒有任何其他辦法來解決這個

try { 
    MyObject ob(arg1,arg2); //this can trow exception 
    try { 

     ob.func1(); //this also can throw exception 
    } catch(std::exception& ex) { 
     //object was constructed ok, so I can access reason/state why the operation failed 
    } 
} catch (std::exception& ex){ 
    //object failed to construct 
} 
+0

你有一個空的構造函數嗎?也許在外面創建默認實例,並在裏面設置值,看看它是否會引發異常?但我們能否看到這個構造函數至少有 –

+0

你怎麼知道構造不是拋出異常的構造? – juanchopanza

+0

如果它在外部捕獲中捕獲,則對象構造拋出異常,否則執行將進入內部try/catch – dev

回答

3

不,你不能做到這一點。從同級catch塊中訪問這個變量是不可能的。

解決的辦法是停止使用異常的流量控制機制 - 他們不是 - 並使用它們,因爲它們的特殊情況的指示 - 在這種情況下,它並不真正的問題是什麼做遙。

0

Andrei Alexandrescu's ScopeGuard可能有助於在這裏:​​

try { 
    MyObject ob(arg1,arg2); 

    SCOPE_FAIL { /* Handler 1 */ }; 

    ob.func1(); 

} catch (std::exception& ex) { 
    /* Handler 2 */ 
} 

如果其範圍是通過堆棧留下平倉SCOPE_FAIL的身體將被執行,也就是異常被拋出。不幸的是,你不能訪問那裏的例外,但你可以訪問ob

程序的其餘部分表現爲通常的,所以執行的樣子:

  1. ob構建成功;
  2. ob.func1()被執行並拋出;
  3. /* Handler 1 */被執行;
  4. ob被破壞;
  5. /* Handler 2 */被執行。
0

不,你不能訪問對象超出範圍。但要回答這個問題:

明白爲什麼FUNC1()失敗

如果對象結構失敗,因爲異常的原因,這意味着的std ::例外已經包含了爲什麼一些信息失敗了。 所以你必須在你的代碼中這樣做:

catch (std::exception& ex){ 
    // object failed to construct 
    std::cout << ex.what() << std::endl; 
} 
+1

我不知道爲什麼這是downvoted。它提出了關於OP提出問題的合理性的重要意義。他們希望'try'範圍內的對象在'catch'範圍內可用,以便他們可以探測它以獲取有關爲什麼失敗的信息。但是,除了機械上這是不可能的事實 - 它也沒有意義,因爲這樣的信息應該由例外提供。這既解釋了他們想要的東西也無法完成,並提供了一個更好的選擇。問題在哪裏? –