C++ 为什么这个代码捕获块不执行?

C++ 为什么这个代码捕获块不执行?,c++,multithreading,error-handling,try-catch,C++,Multithreading,Error Handling,Try Catch,捕获处理程序未运行。但是为什么呢 如果线程t在try块之前启动,则catch处理程序将运行 如果catch块的类型与抛出的类型不匹配,程序将退出,说明线程以未捕获异常终止,这表明异常已被处理,但catch块未运行 #include <iostream> #include <thread> using namespace std; void do_work() {} int main() { std::cerr << "RUNNING" <<

捕获处理程序未运行。但是为什么呢

如果
线程t
try
块之前启动,则catch处理程序将运行

如果catch块的类型与抛出的类型不匹配,程序将退出,说明线程以未捕获异常终止,这表明异常已被处理,但catch块未运行

#include <iostream>
#include <thread>

using namespace std;

void do_work() {}

int main() {
  std::cerr << "RUNNING" << std::endl;
  try {
    thread t(do_work);
    std::cerr << "THROWING" << std::endl;
    throw logic_error("something went wrong");
  } catch (logic_error e) {
    std::cerr << "GOTCHA" << std::endl;
  }

  return 0;
}

您忘记加入线程:

try {
  thread t(do_work);
  t.join();                                    // <<< add this
  std::cerr << "THROWING" << std::endl;
  throw logic_error("something went wrong");
} catch (logic_error e) {
  std::cerr << "GOTCHA" << std::endl;
}
试试看{
螺纹t(不工作);

t、 join();//在C++11,30.3.1.3,线程析构函数中,标准说

如果是joinable(),则终止(),否则不受影响。[注意:隐式分离或在其析构函数中加入joinable()线程可能导致难以调试正确性(用于分离)或性能(用于连接)只有在引发异常时才会遇到错误。因此,程序员必须确保当线程仍然可连接时,不会执行析构函数。-结束说明]

因此,一旦调用线程析构函数,您的程序就会终止,因为作用域结束,
catch
逻辑永远不会执行

如果您希望程序捕获线程作用域之外的异常,但在线程仍然可连接时抛出异常,则需要在线程本身的作用域中捕获异常,或者在线程中捕获异常并重新抛出已捕获的异常

try 
{
  std::thread t(foo);
  try
  {
    std::cerr << "THROWING" << std::endl;
    throw std::logic_error("something went wrong");
  }
  catch (...) // catch everything
  {
    t.join(); // join thread
    throw; // rethrow
  }
  t.join();
}
catch (std::logic_error & e) 
{
  std::cerr << "GOTCHA: " << e.what() << std::endl;
}
试试看
{
标准:螺纹t(foo);
尝试
{

std::cerr请在点击提交按钮之前缩进您的代码这到底是为什么会有否决票?*刮头*@LightnessRacesinOrbit可能有人在代码格式出现问题时投了否决票。@用户2079303:希望他们能多关注这个问题几分钟,而不是通过否决票开车然后走开!@L听不见!听不见!
try 
{
  std::thread t(foo);
  try
  {
    std::cerr << "THROWING" << std::endl;
    throw std::logic_error("something went wrong");
  }
  catch (...) // catch everything
  {
    t.join(); // join thread
    throw; // rethrow
  }
  t.join();
}
catch (std::logic_error & e) 
{
  std::cerr << "GOTCHA: " << e.what() << std::endl;
}