c++的try/catch仅捕获显式throw抛出的异常,无法处理空指针解引用、除零等信号或未定义行为;catch(…)也不能捕获这些,需用sigaction或setunhandledexceptionfilter等平台机制。
直接说结论:C++ 的 try/catch 不是“开关式”异常处理工具,它只捕获被 throw 显式抛出的异常,对空指针解引用、数组越界、除零等底层错误默认不生效——这些属于信号(signal)或未定义行为,catch(...) 也抓不到。
哪些异常能被 try/catch 捕获
只有从 throw 表达式主动抛出的对象才能进入 catch 流程。常见合法抛出包括:
-
throw std::runtime_error("msg")、throw 42、throw std::string("oops") -
标准库函数(如
std::vector::at()、std::stoi())在检查失败时内部调用throw - 你自己写的函数中显式
throw,且调用链未被noexcept阻断
注意:throw 抛出的类型必须能被某个 catch 子句匹配(类型兼容或可隐式转换),否则会调用 std::terminate() 终止程序。
catch(...) 真的能兜住一切吗
不能。它只能捕获 C++ 异常对象,对以下情况完全无效:
立即学习“C++免费学习笔记(深入)”;