我对try catch机制有疑问。像代码:
global value default 0;
int thread1()
{
try
{
set global value to 1;
if exception happens
{
jump into catch;
}
set global value to 0;
}
catch
{
......
}
}
int thread2()
{
ASSERT(global value = 0);
}
如果我有假代码如图所示,在try块中我将全局值设置为1然后发生异常,在thread2中我有一个ASSERT来测试这个全局值是否等于0,那么thread2将明确失败因为在thread1中,我们因为异常而跳转到catch块。那么有人可以给我一些解释吗?我不知道try-catch是如何起作用的。
答案 0 :(得分:0)
例外是对正常执行流程的残酷破坏。纠错流程是找到与抛出的对象相对应的catch;这可能导致几个函数调用反向遍历。这就是为什么它需要谨慎使用它们,你有两个执行流程:正常的一个,错误一个。
如果之后直接捕获了catch-block引发的异常,那么你只需要在catch块中将变量设置为0。
不是,一个好的解决方案是RAII(如评论中所建议的)。 RAII是一个非常简单的想法。如你所知,当控制离开块时,在任何块的入口处的堆栈上创建的每个对象都被销毁,我们的想法是构建一个封装了某个东西的对象,这样就可以调用析构函数:
class GlobalControl {
public:
GlobalControl() { myglob = 1; } // RAII
~GlobalControl() { myglob = 0; } // RRID
};
... // somewhere else
try {
GlobalControl c; // ctor call init glob to 1
...
} // whatever will happens, leaving this block cause a call to dtor of c
catch (...) {
}
RAII代表资源获取是初始化,这里您的资源获取是将全局设置为1,这是在对象的初始化部分中进行的。 RAII应该被称为RAIIRRID,RAII +资源释放是毁灭(资源释放是将你的全局设置为0,这是在析构函数中进行的。)