关于c ++尝试catch的一些问题

时间:2016-01-20 08:06:34

标签: c++ linux unix

我对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是如何起作用的。

1 个答案:

答案 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,这是在析构函数中进行的。)