C++ 異常處理中,throw new std::exception() 拋出的是指針類型(std::exception*),而 catch (std::exception& e) 捕獲的是引用類型,兩者類型不匹配,導致異常穿透至 catch(...),輸出 "why???"。
try {
throw new std::exception(); // 拋出指針
} catch (std::exception& e) { // 捕獲引用,類型不匹配
std::cout << "ok";
} catch (...) {
std::cout << "why???"; // 實際執行這裡
}
try {
throw std::exception(); // 無 new,拋出臨時對象
} catch (const std::exception& e) { // const 引用延長生命周期
std::cout << "ok: " << e.what();
}
try {
throw new std::exception();
} catch (std::exception* e) {
std::cout << "ok: " << e->what();
delete e; // 必須釋放,否則內存洩漏
}
try {
throw std::make_shared();
} catch (const std::shared_ptr& e) {
std::cout << "ok: " << e->what();
}
new。catch(...) 為最後兜底,僅用於日誌記錄後重拋(throw;)或安全關閉。現代編譯器(GCC/Clang/MSVC 高警告級)會對 throw new Exception 發出警告:throwing a pointer to a temporary object 或 catch handler type mismatch。