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