2016-07-22 252 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'范围内可用,以便他们可以探测它以获取有关为什么失败的信息。但是,除了机械上这是不可能的事实 - 它也没有意义,因为这样的信息应该由例外提供。这既解释了他们想要的东西也无法完成,并提供了一个更好的选择。问题在哪里? –