0

在我的代码中,我将 a 传递*this给 a method 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. 我可能在实际代码中还有其他一些错误(因为类似于“异常捕获...”的消息没有被打印出来)。我会保留这个问题以供将来参考。总之谢谢你的关心。

4

0 回答 0