0

0

C++如何处理异常?(try-catch用法详解)

冰火之心

冰火之心

发布时间:2025-12-24 09:33:30

|

415人浏览过

|

来源于php中文网

原创

C++异常处理通过try、catch、throw实现,用于应对不可预测但可恢复的错误;try块必须后跟至少一个catch块,catch按异常类型匹配捕获,未捕获则调用std::terminate终止程序。

c++如何处理异常?(try-catch用法详解)

在C++中,异常处理主要通过 trycatchthrow 三个关键字配合实现。它不是用来替代常规错误检查(比如判断指针是否为空),而是应对程序运行中**不可预测、非常规但可恢复的错误场景**,比如内存分配失败、文件打开失败、数组越界访问(需手动检查)等。

基本语法结构:try-catch捕获异常

核心结构是把可能出问题的代码放在 try 块中,用一个或多个 catch 块来接收并处理抛出的异常:

  • try 块必须紧跟至少一个 catch,不能单独存在;
  • catch 后面的括号里写的是**异常类型**(可以是内置类型如 intconst char*,也可以是自定义类),支持类型匹配和自动类型转换(有限制);
  • 一旦 try 中某处执行了 throw,程序立即跳出当前函数调用,逐层向上寻找匹配的 catch;没找到就终止程序(调用 std::terminate)。

示例:

try {
    int* p = new int[1000000000]; // 可能抛出 std::bad_alloc
    throw std::runtime_error("模拟运行时错误");
} catch (const std::runtime_error& e) {
    std::cout << "捕获 runtime_error: " << e.what() << "\n";
} catch (const std::exception& e) {
    std::cout << "捕获其他标准异常: " << e.what() << "\n";
} catch (...) {
    std::cout << "捕获所有其他类型的异常(慎用)\n";
}

推荐使用标准异常类,而非原始类型

C++标准库提供了 中的一系列异常类(如 std::invalid_argumentstd::out_of_rangestd::logic_errorstd::runtime_error 等),它们都继承自 std::exception,具备 what() 成员函数返回描述信息。

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

LALALAND
LALALAND

AI驱动的时尚服装设计平台

下载
  • throw 42throw "error" 更安全、更语义清晰;
  • 便于统一捕获基类(如 catch(const std::exception&)),也支持多级细化处理;
  • 避免因类型不匹配导致异常未被捕获(例如 throw "hello"const char*,用 catch(std::string) 就捕不到)。

throw 表达式:主动抛出异常

throw 后面可以是任意表达式,其类型就是该异常的类型:

  • throw 123; → 抛出 int 类型异常;
  • throw std::logic_error("参数非法"); → 抛出临时对象;
  • throw;(不带表达式)只能出现在 catch 块中,表示**重新抛出当前正在处理的异常**,常用于日志记录后继续上抛。

注意:不要抛出局部对象的引用或指针(会悬空),优先抛值或 const 引用。

异常规范与 noexcept(现代 C++ 推荐)

C++11 起,用 noexcept 替代旧的异常说明符(如 throw()):

  • void func() noexcept; 表示承诺绝不抛出异常;若违反,调用 std::terminate
  • void func() noexcept(true); 等价于上面写法;noexcept(false) 表示可能抛出;
  • 编译器可据此优化(如移动构造函数是否调用),且标准容器对 noexcept 移动操作有特殊要求。

不建议为每个函数加 noexcept,只在明确不抛异常且有性能/正确性需求时使用(如析构函数、移动操作、swap 等)。

相关专题

更多
string转int
string转int

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

318

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

280

2023.10.25

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

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

524

2023.09.20

string转int
string转int

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

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外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号