关于异常堆栈展开的参考参数

时间:2018-03-02 13:09:17

标签: c++ exception exception-handling try-catch stack-unwinding

在我的代码中,我将*this传递给方法foo(const MyClass& arg)异常在这个foo内部被抛出,但是虽然在堆栈中存在一个语法正确的 try-catch 块,但它既没有被处理(应该在那里发出一条消息)案例),也没有进程崩溃。从调试日志中,我可以看到相关的线程被卡住了,尽管其余的线程仍在继续。

我经历过堆栈展开文档,在某些地方我已经看到函数的参数也被认为是自动变量,并在展开过程中被销毁。这让我想到了一个问题:当我将 this 的const引用(其中有一个相应的 catch 块)传递给一个异常的方法时会发生什么被抛出?是否有可能ref使得调用者对象被破坏,并且即使已经开始堆栈展开,catch块现在也无法访问?

让我添加一些伪代码:

void MyClass0::someFunc(void)
{
    try
    {
        MyClass1 obj1;
        obj1.someOtherFunc(*this);
        // Some other stuff
    }
    catch (MyException&)
    {
        std::cout << "Handling exception...";
        // Whatever... This message is not emitted.
    }
}

void MyClass1::someOtherFunc(const MyClass0& argObj0)
{
    // Some functions that eventually throw an unhandled MyException
}

提前致谢...

修改: 好的,尝试生成一个可执行代码供参考,我相信我几乎回答了我自己的问题。

以下是代码:

#include "sandbox.h"
#include <iostream>

MyClass0::MyClass0(void)
{
    std::cout << "\nConstructing MyClass0";
}
MyClass0::~MyClass0(void) 
{
    std::cout << "\nDestructing MyClass0";
}
void MyClass0::trustIssues(void)
{
    std::cout << "\nEntering " << __FUNCTION__;

    try
    {
        MyClass1 myClass1;
        myClass1.unwaryFunction(*this);
    }
    catch (MyException& exc)
    {
        std::cout << "\nException caught in " << __FUNCTION__;
        std::cout << "\nLeaving " << __FUNCTION__ << " from inside catch block.";
        return;
    }

    std::cout << "\nLeaving " << __FUNCTION__;
}

MyClass1::MyClass1(void)
{
    std::cout << "\nConstructing MyClass1";
}
MyClass1::~MyClass1(void) 
{
    std::cout << "\nDestructing MyClass1";
}
void MyClass1::unwaryFunction(MyClass0& argClass0) 
{
    std::cout << "\nEntering " << __FUNCTION__;

    suicidalFunction();

    std::cout << "\nLeaving " << __FUNCTION__;
}

void suicidalFunction(void)
{
    std::cout << "\nEntering " << __FUNCTION__;

    MyException myException;
    throw myException;

    std::cout << "\nLeaving " << __FUNCTION__;
}

int main(int argc, char* argv[])
{
    MyClass0 myClass0;
    myClass0.trustIssues();

    return 0;
}

输出结果为:

Constructing MyClass0
Entering MyClass0::trustIssues
Constructing MyClass1
Entering MyClass1::unwaryFunction
Entering suicidalFunction
Destructing MyClass1
Exception caught in MyClass0::trustIssues
Leaving MyClass0::trustIssues from inside catch block.

这意味着*this参数在unwaryFunction的堆栈展开时不会被破坏。我可能在实际代码中有一些其他错误(因为类似于“异常陷入...”的消息不会被打印)。我会保留这个问题以供将来参考。无论如何,谢谢你的关注。

0 个答案:

没有答案