0

0

c++如何处理异常_c++ try catch异常捕获【教程】

穿越時空

穿越時空

发布时间:2026-02-08 11:43:02

|

660人浏览过

|

来源于php中文网

原创

C++的try/catch仅捕获显式throw抛出的异常,无法处理空指针解引用、除零等信号或未定义行为;catch(...)也不能捕获这些,需用sigaction或SetUnhandledExceptionFilter等平台机制。

c++如何处理异常_c++ try catch异常捕获【教程】

直接说结论:C++ 的 try/catch 不是“开关式”异常处理工具,它只捕获被 throw 显式抛出的异常,对空指针解引用、数组越界、除零等底层错误默认不生效——这些属于信号(signal)或未定义行为,catch(...) 也抓不到。

哪些异常能被 try/catch 捕获

只有从 throw 表达式主动抛出的对象才能进入 catch 流程。常见合法抛出包括:

  • throw std::runtime_error("msg")throw 42throw std::string("oops")
  • 标准库函数(如 std::vector::at()std::stoi())在检查失败时内部调用 throw
  • 你自己写的函数中显式 throw,且调用链未被 noexcept 阻断

注意:throw 抛出的类型必须能被某个 catch 子句匹配(类型兼容或可隐式转换),否则会调用 std::terminate() 终止程序。

catch(...) 真的能兜住一切吗

不能。它只能捕获 C++ 异常对象,对以下情况完全无效:

立即学习C++免费学习笔记(深入)”;

  • Linux 下的 SIGSEGV(段错误)、SIGFPE(浮点异常)等信号
  • Windows 下的 ACCESS_VIOLATIONINTERRUPT
  • 未初始化指针解引用、野指针、溢出、delete 已释放内存等未定义行为

如果真想拦截这类错误,得用平台相关机制:sigaction()(Linux)、SetUnhandledExceptionFilter()(Windows),但它们和 try/catch 属于不同机制,不能混用。

通义视频
通义视频

通义万相AI视频生成工具

下载

为什么 catch 块里别写太重的逻辑

异常处理期间栈正在展开(stack unwinding),此时若在 catch 中抛出新异常且未被处理,程序直接终止。更隐蔽的风险是:

  • catch 中调用可能抛异常的函数(比如 std::string 构造、new 内存分配)
  • catch 中调用未声明 noexcept 的析构函数(尤其当该析构函数又抛异常)
  • 试图在 catch 中恢复执行流到异常点(C++ 不支持“继续执行”)

稳妥做法是:在 catch 中只做日志、资源清理(确保不抛异常)、或转为错误码/状态返回;复杂恢复逻辑应放在上层调用者中判断后执行。

常见误用与编译器差异

不同编译器对异常支持有实际影响:

  • Clang/GCC 默认启用异常(-fexceptions),但若加了 -fno-exceptions,所有 try/catch/throw 会被禁用,编译报错
  • MSVC 在 `/EHsc` 模式下才支持 C++ 异常;`/EHs-` 会禁用异常处理,throw 变成未定义行为
  • 嵌入式或性能敏感场景常全局禁用异常,此时必须用返回码、std::optionalstd::expected(C++23)替代

一个容易忽略的细节:catch 按顺序匹配,基类 catch 必须放在派生类之后,否则派生类分支永远无法到达——这不是语法错误,而是逻辑失效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

626

2023.08.02

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

404

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

584

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

283

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

954

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1139

2023.07.27

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.7万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号