如何在Try中声明变量并在Catch中访问它?

时间:2016-07-22 14:44:17

标签: c++

我在try / catch块中创建了我的类的对象,并且想要在异常情况下在catch块中访问它。即使对象创建正常,我也无法在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
}

3 个答案:

答案 0 :(得分:3)

不,你不能这样做。无法从同一级别的catch块访问此变量。

解决方案是停止使用异常作为流量控制机制 - 它们不是 - 并按原样使用它们,表示异常情况 - 在这种情况下,投掷的内容并不重要。

答案 1 :(得分:1)

不,您无法访问超出范围的对象。但要回答这个问题:

  

了解func1()失败的原因

如果对象构造因异常而失败,则意味着std :: exception已经包含有关失败原因的一些信息。 所以你必须在代码中执行此操作:

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

答案 2 :(得分: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 */已执行。