【问题标题】:Is a function-try-block equivalent to a try-catch encompassing whole function?函数try-block是否等同于包含整个函数的try-catch?
【发布时间】:2020-07-08 12:47:03
【问题描述】:

我正在运行一个boost::thread,它被我程序中的其他地方中断了。

auto my_thread = boost::thread(&threadedFunction, this);

像这样使用function-try-block

void threadedFunction() try {
  // do stuff
} catch (boost::thread_interrupted &) {
  // handle error
}

相当于使用包含整个函数的 try-catch 块?

void threadedFunction() {
  try {
    // do stuff
  } catch (boost::thread_interrupted &) {
    // handle error
  }
}

它们可能不等价,因为my_thread 可以在进入try 块之前被中断,在这种情况下,程序会崩溃。话虽如此,我不确定这是否可能。

两个代码块是否等效?

【问题讨论】:

    标签: multithreading c++11 exception boost try-catch


    【解决方案1】:

    是的,但不适用于构造函数。

    这就是为什么 function-try-block was invented:

    function-try-blocks 的主要目的是通过记录和重新抛出、修改异常对象并重新抛出、抛出不同的异常或终止程序来响应构造函数中的成员初始化列表抛出的异常。

    旁注:线程中断

    Boost 的线程中断机制是协作的,而不是异步的(如 POSIX 信号)。这意味着,{try { 之间不能有中断:

    即使 完全异步的,那么推理“差异”仍然没有任何意义,因为无论如何都不会有任何发生前的关系,因此两种结果都可能发生在两者中无论如何(这取决于时间)。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 2016-02-14
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      相关资源
      最近更新 更多