#include <iostream>
#include <thread>
#include <stdexcept>
using namespace std;
template<typename Func>
void exceptionCatcher(Func func)
{
try {
func();
}
catch (const exception& e) {
cout << "Caught exception\n";
}
}
int main()
{
string str("Hello, world");
auto func = [str]{
cout << str << endl;
throw exception();
};
thread myThread2(
exceptionCatcher<decltype(func)>,
func
);
myThread2.join();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8c3RkZXhjZXB0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4Kdm9pZCBleGNlcHRpb25DYXRjaGVyKEZ1bmMgZnVuYykKewogICAgdHJ5IHsKICAgICAgICBmdW5jKCk7CiAgICB9CiAgICBjYXRjaCAoY29uc3QgZXhjZXB0aW9uJiBlKSB7CiAgICAgICAgY291dCA8PCAiQ2F1Z2h0IGV4Y2VwdGlvblxuIjsKICAgIH0KfQoKaW50IG1haW4oKQp7CglzdHJpbmcgc3RyKCJIZWxsbywgd29ybGQiKTsKCglhdXRvIGZ1bmMgPSBbc3RyXXsKCQljb3V0IDw8IHN0ciA8PCBlbmRsOwoJCXRocm93IGV4Y2VwdGlvbigpOwoJfTsKCgl0aHJlYWQgbXlUaHJlYWQyKAoJCWV4Y2VwdGlvbkNhdGNoZXI8ZGVjbHR5cGUoZnVuYyk+LAoJCWZ1bmMKCSk7CgogICAgbXlUaHJlYWQyLmpvaW4oKTsKCiAgICByZXR1cm4gMDsKfQ==