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;
}