C++11 introduced the exception_ptr
type that allows to transport exceptions between threads:
#include<iostream>
#include<thread>
#include<exception>
#include<stdexcept>
static std::exception_ptr teptr = nullptr;
void f()
{
try
{
std::this_thread::sleep_for(std::chrono::seconds(1));
throw std::runtime_error("To be passed between threads");
}
catch(...)
{
teptr = std::current_exception();
}
}
int main(int argc, char **argv)
{
std::thread mythread(f);
mythread.join();
if (teptr) {
try{
std::rethrow_exception(teptr);
}
catch(const std::exception &ex)
{
std::cerr << "Thread exited with exception: " << ex.what() << "\n";
}
}
return 0;
}
Because in your case you have multiple worker threads, you will need to keep one exception_ptr
for each of them.
Note that exception_ptr
is a shared ptr-like pointer, so you will need to keep at least one exception_ptr
pointing to each exception or they will be released.
Microsoft specific: if you use SEH Exceptions (/EHa
), the example code will also transport SEH exceptions like access violations, which may not be what you want.