c++如何捕获异常_c++ try catch异常处理【教程】
技术百科
穿越時空
发布时间:2026-01-27
浏览: 次 try/catch仅能捕获显式throw或标准库明确声明抛出的C++异常,无法捕获段错误、访问违规等操作系统信号;应优先采用防御性编程、错误码和调试工具而非依赖catch(...)兜底。
直接用 try 和 catch 就能捕获 C++ 异常,但多数崩溃不是由 throw 触发的——比如空指针解引用、数组越界、除零这些,C++ 标准不保证抛出异常,try/catch 压根捕不到。
哪些异常能被 try/catch 捕获
只能捕获显式 throw 出来的异常,或标准库中明确声明会抛异常的函数(如 std::vector::at() 越界时抛 std::out_of_range)。
-
std::string构造失败可能抛std::bad_alloc 
dynamic_cast对指针返回nullptr,但对引用失败时会抛std::bad_cast-
std::stoi解析失败抛std::invalid_argument或std::out_of_range - 自己写的函数里用
throw std::runtime_error("xxx"),当然也能被捕获
为什么 try/catch 捕不到段错误、访问违规
这类是操作系统信号(Unix 的 SIGSEGV,Windows 的 ACCESS_VIOLATION),属于底层硬件/运行时异常,不在 C++ 异常机制范围内。C++ 的 try/catch 是语言级控制流,和信号处理完全无关。
- 想拦截段错误,得用
signal()(POSIX)或SetUnhandledExceptionFilter()(Windows),但这属于平台相关且高危操作 - 启用编译器选项(如 GCC 的
-fsanitize=address)可在调试期检测越界,但不是运行时捕获 -
std::set_terminate()只在未捕获异常终止前调用,对信号无效
catch(...) 能兜住一切?
不能。它只捕获 C++ 异常对象,不捕获信号、不捕获 C 风格 longjmp、不捕获 Windows SEH 异常(除非编译器开启特定兼容模式,如 MSVC 的 /EHa)。
-
catch(...)在 MSVC 下配合/EHa可捕获 SEH,但会破坏栈展开语义,导致RAII失效(析构函数可能不执行) - Clang/GCC 默认不支持 SEH,
catch(...)仅对标准 C++ 异常有效 - 即使能捕获,也不建议用
catch(...)替代错误检查——它掩盖了问题类型,不利于定位
真正健壮的错误处理怎么做
别依赖 try/catch 拦截所有错误。优先用防御性编程 + 明确错误码 + 工具链辅助。
- 用
std::vector::at()替代operator[],主动触发可捕获异常 - 对指针解引用前判空,对整数除法前检查除数是否为零
- 启用
-D_GLIBCXX_DEBUG(libstdc++)或_ITERATOR_DEBUG_LEVEL=2(MSVC)获取容器越界诊断 - 生产环境用
core dump+gdb或WinDbg分析崩溃点,比试图“捕获”更可靠
异常机制设计初衷是处理“异常但可预期”的错误(如文件不存在、网络超时),不是替代空指针检查或边界校验。混淆这两者,代码会越来越难维护。
# ai
# 操作系统
# 就能
# 这类
# 也不
# 也能
# windows
# 可在
# 不存在
# 错误码
# 是由
# 工具
# win
# 对象
# c++
# String
# 标准库
# 指针
# access
# 为什么
# 栈
# igs
# signal
# operator
# 析构函数
# 空指针
# try
# throw
# catch
# 抛出
# unix
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php转mp4怎么设置帧率_调整php生成mp4视
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- 如何使用Golang读取日志文件_Golang b
- c++的位运算怎么用 与、或、异或、移位操作详解【
- c++怎么处理多线程死锁_c++ lock_gua
- Go语言中正确反序列化多个同级XML元素为结构体切
- Win11怎么查看硬盘型号_Windows 11检
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Windows电脑如何截屏?(四种快捷方法)
- Win10怎样安装PPT模板_Win10安装PPT
- XAMPP 启动失败(Apache 突然停止)的终
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Windows10无法识别USB设备描述符请求失败
- 用Python构建微服务架构实践_FastAPI与
- Go语言中slice追加操作的底层共享机制解析
- Python对象生命周期管理_创建销毁说明【指导】
- Windows10如何更改桌面背景_Win10个性
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Win11怎么更改文件夹图标_自定义Win11文件
- php能跑在stm32上吗_php在stm32微控
- Win11怎么更改账户头像_Windows 11自
- Windows 11无法安全删除U盘提示设备正在使
- Win11如何暂停系统更新 Win11暂停更新最长
- Windows如何使用注册表查找和删除项?(reg
- c++ unordered_map怎么用 c++哈
- Windows执行文件被SmartScreen拦截
- Win11怎么设置触控板手势_Windows11三
- Windows10如何查看保存的WiFi密码_Wi
- Windows10系统怎么查看硬盘健康_Win10
- Win11如何设置系统声音_Win11系统声音调整
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- 为什么本地php环境运行php脚本卡顿_php执行
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- Win11怎么设置声音输出设备_Windows11
- Win11怎么更改系统语言_Win11中文语言包下
- Win11怎么关闭通知消息_屏蔽Windows 1
- Windows10系统更新错误0x80070002
- Win11怎么关闭自动修复_跳过Win11开机自动
- php8.4如何实现队列任务_php8.4redi
- Windows11怎样开启游戏模式_Windows
- 如何在Golang中实现WebSocket广播_使
- Win10怎么关闭自动更新错误重启 Win10策略
- LINUX怎么进行文本内容搜索_Linux gre
- Win11文件夹预览图不显示怎么办_Win11缩略
- mac怎么安装pip_MAC Python pip
- Windows 11如何查看系统激活密钥_Wind
- mac怎么查看wifi密码_MAC查看已连接WiF
- Python类装饰器使用_元编程解析【教程】
- Win11如何设置环境变量 Win11添加和修改系
- Win10如何卸载WindowsDefender_


QQ客服