关于C ++的一些问题尝试捕获

some problems about c++ try catch

本文关键字:问题 关于      更新时间:2023-10-16

我有一个关于尝试捕获机制的问题。 像代码一样:

  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,然后发生异常,在线程 2 中我有一个 ASSERT 来测试此全局值是否等于 0,则 thread2 将显式失败,因为在线程 1 中,我们跳入 catch 块因为异常。那么谁能给我一些解释?我不知道尝试--catch如何防止这种情况。

例外情况是残酷地破坏了正常的执行流程。纠错流程是找到与抛出的对象对应的捕获;这可能会导致多次函数调用反向遍历。这就是为什么需要小心使用它们的原因,您有两个执行流程:正常执行流程和错误执行流程。

如果抛出的异常被紧随其后的 catch 块捕获,那么您只需要在 catch-block 中将变量设置为 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,这是在析构函数中进行的)。