0

0

C++如何处理异常(try-catch)?(程序的错误捕获与处理)

冰火之心

冰火之心

发布时间:2026-01-09 16:11:32

|

370人浏览过

|

来源于php中文网

原创

try-catch基本写法是用try包裹可能抛异常代码,catch按顺序精确匹配异常类型(支持派生类→基类隐式转换),推荐使用const引用避免切片和拷贝;无匹配时栈展开,最终调用std::terminate终止程序。

c++如何处理异常(try-catch)?(程序的错误捕获与处理)

try-catch 基本写法和执行流程

直接用 try 包住可能抛出异常的代码,用 catch 捕获对应类型的异常。C++ 不会自动向上查找匹配的 catch 块,类型必须精确匹配(或能隐式转换,比如派生类 → 基类),否则异常会继续向外传播,最终调用 std::terminate() 终止程序。

常见错误现象:捕获了 int 却抛出 std::string,或者写了 catch (std::exception e)(传值)却没加 &,导致对象被切片或额外拷贝。

  • catch 参数推荐用 const std::exception& 或更具体的异常类型引用,避免拷贝和切片
  • 多个 catch 块按顺序匹配,更具体的类型要放在更通用的类型前面(比如先 catch (const std::out_of_range&),再 catch (const std::exception&)
  • 没有匹配的 catch 时,会持续展开,若到 main() 还没被捕获,程序直接终止
try {
    throw std::runtime_error("something went wrong");
} catch (const std::runtime_error& e) {
    std::cout << "Caught: " << e.what() << "\n";
} catch (const std::exception& e) {
    std::cout << "Fallback: " << e.what() << "\n";
}

throw 表达式与自定义异常类

throw 后面可以是任意类型表达式,但强烈建议只抛出继承自 std::exception 的类对象(或标准库已提供的异常如 std::logic_error)。自己定义异常类时,至少实现 what() 成员函数并返回 C 风格字符串。

容易踩的坑:在 what() 中返回局部变量的 c_str(),导致悬垂指针;或者抛出临时对象后在 catch 中取地址,引发未定义行为。

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

  • 自定义异常类的 what() 返回值应指向生命周期足够长的存储(比如 std::string 成员的 c_str(),且该 std::string 是类的成员)
  • 不要抛出裸指针、数组或栈上局部对象的地址
  • 如果函数声明了 noexcept,却意外抛出异常,会立即调用 std::terminate()
class MyException : public std::exception {
    std::string msg_;
public:
    MyException(const std::string& msg) : msg_(msg) {}
    const char* what() const noexcept override {
        return msg_.c_str();
    }
};

// 使用 throw MyException("invalid input");

异常安全与资源管理(RAII 是关键)

C++ 异常处理本身不提供资源释放机制。一旦抛出异常,栈展开过程中,所有已构造的局部对象会按逆序析构——这是 RAII(Resource Acquisition Is Initialization)生效的前提。但如果手动用 new 分配内存、用 fopen 打开文件,又没在 catch 里显式清理,就会泄漏。

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载

典型错误场景:在 try 块里 new 一块内存,然后抛异常,catch 块里忘了 delete;或者用了原始指针管理资源,却期望异常发生时自动释放。

  • 优先使用智能指针(std::unique_ptrstd::shared_ptr)、容器(std::vector)、文件流(std::ifstream)等自带析构逻辑的类型
  • 避免在构造函数中抛出异常的同时持有裸资源(比如 new 成功但后续初始化失败)
  • 不要在析构函数里抛异常(C++11 起默认为 noexcept,否则直接调用 std::terminate()

什么时候不该用 try-catch?

异常适合处理“罕见、不可预测、无法在当前上下文恢复”的错误,比如磁盘满、网络断连、无效输入导致的解析失败。但像循环索引越界、空指针解引用这类逻辑错误,应该靠断言(assert)或防御性编程提前拦截,而不是依赖异常捕获。

性能上,现代编译器对无异常抛出的代码几乎零开销(zero-cost exceptions),但频繁抛出/捕获仍比返回错误码慢得多。尤其在实时或嵌入式场景,很多项目直接禁用异常(-fno-exceptions)。

  • 不应用异常替代常规控制流(比如用 throw 实现 goto 效果)
  • 系统级 API(如 POSIX 函数)通常用返回码和 errno,不要包装成异常再抛,除非有明确封装层职责
  • 跨动态库边界抛异常风险高(ABI 不统一),尽量在库接口层吞掉异常,转为错误码或日志

异常真正难的不是语法,而是判断哪一层该捕获、哪一层该继续传播,以及确保每条路径都维持对象不变量——这需要结合具体模块职责来设计,不能只看 trycatch 写在哪。

相关专题

更多
string转int
string转int

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

315

2023.08.02

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

146

2023.12.20

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

go语言goto的用法
go语言goto的用法

本专题整合了go语言goto的用法,阅读专题下面的文章了解更多详细内容。

133

2025.09.05

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

614

2023.11.24

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

23

2026.01.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

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

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