假設我想創建一個例外物件,但稍后再拋出它。我的用例是例外是在執行緒中生成的,但我需要從我的主執行緒中實際拋出它(因為沒有人在子執行緒中捕獲它)
using namespace std;
runtime_error *ex = nullptr;
thread myThread( [&ex]{
if (something_went_wrong) {
ex = new runtime_error("Something went wrong");
return;
}
} );
myThread.join();
if (ex != nullptr) {
throw *ex;
}
對于它的價值,編譯器似乎對此很滿意,但我可以看到它充其量只是資源泄漏。有正確的方法嗎?
uj5u.com熱心網友回復:
std::exception_ptr是存盤例外的 C 工具。它通常可以避免額外的分配。
std::exception_ptr ex = nullptr;
std::thread myThread( [&ex]{
if (something_went_wrong) {
ex = std::make_exception_ptr(std::runtime_error("Something went wrong"));
return;
}
} );
myThread.join();
if (ex != nullptr) {
std::rethrow_exception(ex);
}
而且由于它可以存盤任何型別的例外,因此您可以通過包裝 lambda 來存盤可能在執行緒中拋出的任何內容,例如:
std::thread myThread( [&ex]{
try {
// do things
} catch (...) {
ex = std::current_exception();
}
} );
或者,您可以使用std::optional<std::runtime_error>
std::optional<std::runtime_error> ex;
std::thread myThread( [&ex]{
if (something_went_wrong) {
ex.emplace("Something went wrong");
return;
}
} );
myThread.join();
if (ex) {
throw *ex;
}
由于您不動態分配,因此不會泄漏
uj5u.com熱心網友回復:
這是我找到的一個解決方案,但我更喜歡 unique_ptr 解決方案。為了完整起見,將其寫在這里:
using namespace std;
runtime_error *ex = nullptr;
thread myThread( [&ex]{
if (something_went_wrong) {
ex = new runtime_error("Something went wrong");
return;
}
} );
myThread.join();
if (ex != nullptr) {
runtime_error e2 = *ex;
delete ex;
throw e2;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458716.html
下一篇:傳遞多個引數...使用增強的for回圈,導致ArrayIndexOutOfBoundsExceptionJAVA
