当前位置: 首页 > news >正文

C++异常详细介绍

C++异常是一种处理程序运行时错误的机制,它允许程序在检测到错误时跳转到预定义的错误处理代码,而不必通过函数返回值层层传递错误信息。

异常的基本概念
  • 异常抛出(throw):当程序检测到错误时,使用​​throw​​关键字抛出一个异常对象
  • 异常捕获(catch):使用​​try-catch​​块捕获并处理抛出的异常
  • 异常传播:如果当前函数不能处理异常,异常会沿着函数调用栈向上传播,直到找到合适的处理代码
异常处理的基本语法

代码语言:javascript

代码运行次数:0

运行

AI代码解释

try {// 可能抛出异常的代码if (error_condition) {throw exception_object; // 抛出异常}
}
catch (exception_type1 e) {// 处理type1类型的异常
}
catch (exception_type2 e) {// 处理type2类型的异常
}
catch (...) {// 处理所有其他类型的异常(通配符)
}
异常类型

C++允许抛出任何类型的异常,包括:

  1. 基本数据类型:如intchar

代码语言:javascript

代码运行次数:0

运行

AI代码解释

throw 404; // 抛出整数异常
throw "Not found"; // 抛出字符串字面量异常
  1. 自定义类型:通常是类或结构体

代码语言:javascript

代码运行次数:0

运行

AI代码解释

class MyException {
private:string message;
public:MyException(string msg) : message(msg) {}string getMessage() const { return message; }
};// 抛出自定义异常
throw MyException("发生了错误");
  1. 标准库异常:C++标准库提供了一系列异常类,定义在<exception>头文件中,主要包括:
  • ​std::exception​​:所有标准异常的基类
  • ​std::runtime_error​​:运行时错误
  • ​std::logic_error​​:逻辑错误
  • ​std::out_of_range​​:超出范围错误(如数组越界)
  • ​std::invalid_argument​​:无效参数错误
异常规范(C++11前)

早期C++允许使用异常规范指定函数可能抛出的异常类型:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 声明该函数可能抛出int或string类型的异常
void func() throw(int, string) {// ...
}// 声明该函数不抛出任何异常
void func() throw() {// ...
}

C++11引入了​​noexcept​​关键字替代异常规范:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 声明该函数不会抛出任何异常
void func() noexcept {// ...
}// 条件性noexcept
void func() noexcept(condition) {// ...
}
异常处理的最佳实践
  1. 只在异常情况下使用异常:不要将异常用于常规控制流
  2. 捕获适当的异常类型:避免过度使用​​catch(...)​
  3. 按引用捕获异常:避免异常对象的复制,同时允许捕获派生类异常

代码语言:javascript

代码运行次数:0

运行

AI代码解释

catch (const MyException& e) { // 推荐使用const引用// ...
}
  1. 清理资源:使用RAII(资源获取即初始化)技术确保资源正确释放
  2. 异常安全:设计函数时考虑异常发生时的状态一致性
异常的优缺点

优点

  • 分离正常代码和错误处理代码,提高可读性
  • 可以在调用链的任意层次处理异常,不必每层都检查错误
  • 能够传递更丰富的错误信息

缺点

  • 可能影响性能(异常处理代码通常不被编译器优化)
  • 过度使用会使程序逻辑变得复杂
  • 可能导致资源泄露(如果没有正确处理)
示例:完整的异常处理程序

代码语言:javascript

代码运行次数:0

运行

AI代码解释

#include <iostream>
#include <stdexcept>
#include <string>using namespace std;// 除法函数,当除数为0时抛出异常
double divide(double num, double den) {if (den == 0) {throw invalid_argument("除数不能为0");}return num / den;
}int main() {try {double result = divide(10, 0);cout << "结果: " << result << endl;}catch (const invalid_argument& e) {cerr << "错误: " << e.what() << endl;}catch (...) {cerr << "发生了未知错误" << endl;}return 0;
}

这个例子中,​​divide​​函数在检测到除数为0时抛出​​invalid_argument​​异常,​​main​​函数中的​​try-catch​​块捕获并处理这个异常,确保程序能够优雅地处理错误情况。

http://www.dtcms.com/a/524155.html

相关文章:

  • AKKO 3180键盘插到联想笔记本无法使用问题
  • 打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第六天)
  • 从项目中学习CAN和CANFD报文结构(新手入门)
  • SpreadJS 赋能在线 Excel:协同编辑与精细化权限管控的技术实现
  • RabbitMQ 持久性详解
  • cms网站栏目介绍html免费模板下载
  • 太原网站建设培训班wordpress购买按钮插件
  • 北斗导航 | 接收机自主完好性监测(RAIM)在列车中的应用:原理、现状、挑战与案例
  • 前端Sass完全指南:从入门到精通
  • 网站建设地域名高校网站建设 网站群
  • 破局制造业数据孤岛,大腾智能PDM实现产研协同
  • 小程序文件在线显示(支持word,图片,视频等)
  • 记录自己写项目的第三天,springbot+redis+rabbitma高并发项目
  • Linux下查看系统启动时间、运行时间
  • Linux中子系统注册subsystem_register等函数的实现
  • MFC应用程序,工作线程学习记录
  • 在什么网站做公司人员增减wordpress主题标签
  • 广州新塘网站制作推广网站服务器检测
  • 金仓多模数据库:电子证照系统国产化替代MongoDB的优选方案
  • SQL之键与约束——数据库设计的基石与数据完整性的守护者
  • 百度网站收录查询地址保定网站推广多少钱
  • 移动端网站如何开发一呼百应网
  • Spring Boot集合RabbitMQ
  • 傻瓜式大型网站开发工具金融 网站 源码
  • 精准与安全并重!NHVOC-1 (C) 型便携式 VOCs 分析仪(PID + 催化氧化 - NDIR)深度解析
  • WPF ComboBox 样式
  • paddlenlp 3.x 版本使用uie-m-base报错找不到 static/inference.pdmodel
  • 郑州市有做网站的吗wordpress如何设置点击直接下载
  • 深度学习打卡第TR5周:Transformer实战:文本分类
  • 一个强大的开源OCR工具,基于DeepSeek OCR