亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 异常处理实战:try、catch、throw 完整指南与示例

什么是 C++ 异常处理?

异常处理让 C++ 程序能优雅地从意外运行时错误中恢复。错误发生时,控制流跳转到专门的处理器,由其决定如何响应。

将可能出错的代码放入 try 块,后跟一个或多个 catch 子句,即可为程序提供清晰的异常处理路径。

若无异常抛出,try 块正常执行,处理器被跳过。

本教程你将学到:

为什么需要异常处理?

异常处理提供实实在在的好处:

异常处理三大关键字

三个关键字构成 C++ 异常处理的骨干:

try 块内的代码称为受保护代码;若抛出异常,对应的 catch 块执行。

语法

 try { // 受保护代码 } catch (Exception_Name exception1) { // 处理 exception1 } catch (Exception_Name exception2) { // 处理 exception2 } // ... 更多 catch 块 

示例 1:访问越界的 vector 元素

#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); try { vec.at(2); // 越界 } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; } 

输出:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码截图:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码拆解:

  1. 包含 iostream 和 vector 用于 I/O 与容器支持。
  2. 使用 std 命名空间避免全限定名。
  3. 实例化 vector<int> 并填充数据。
  4. 在 try 块中尝试访问超出 vector 范围的元素。
  5. 捕获标准 std::exception 并输出提示。
  6. 从 main 返回。

示例 2:处理除零错误

#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return static_cast<double>(x) / y; } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; } 

输出:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码截图:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码拆解:

  1. 定义 zeroDivision,除数为零时抛出 C 字符串。
  2. 在 try 块中调用该函数并打印结果。
  3. 捕获字符串异常并输出错误信息。

C++ 标准异常

C++ 异常处理实战:try、catch、throw 完整指南与示例

标准库在 <exception> 中声明了丰富的异常层级。常用异常如下:

异常说明
std::exception所有标准异常的基类
std::bad_allocnew 分配失败时抛出
std::bad_castdynamic_cast 转型失败时抛出
std::bad_exception用于指示意外异常
std::bad_typeidtypeid 作用于空多态左值时抛出
std::logic_error程序员应可检测到的逻辑错误
std::domain_error数学函数域无效
std::invalid_argument函数接收无效参数
std::length_error尝试创建过长字符串
std::out_of_rangevector::at 索引越界时抛出
std::runtime_error其他类别未捕获的运行时错误
std::overflow_error数学上溢
std::range_error值超出操作范围
std::underflow_error数学下溢

用户自定义异常

可扩展 std::exception 基类创建领域特定错误类型。重写 what() 提供描述性消息。

示例:自定义异常

#include <iostream> #include <exception> using namespace std; class NewException : public exception { public: const char* what() const noexcept override { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; } 

输出:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码截图:

C++ 异常处理实战:try、catch、throw 完整指南与示例

代码拆解:

  1. 从 std::exception 派生 NewException 并重写 what()。
  2. 实例化 newex 用于抛出。
  3. 在 try 块中抛出 newex。
  4. 以引用捕获 std::exception 并通过 what() 打印消息。

核心收获

C语言

  1. C++ 注释最佳实践:编写可读、可维护代码的注释艺术
  2. C++ 运算符全解析:类型、示例与示例程序
  3. 掌握 C++ switch-case:语法、用法与实战示例
  4. C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
  5. C++ 结构体详解:定义、初始化、指针、函数参数与局限性
  6. 掌握 C++ std::list:语法、函数与实战示例
  7. C++ Struct 与 Class 核心差异、语法及最佳实践
  8. 2021 年 Windows/macOS/Linux 上 15 款最佳 C++ IDE(免费与付费)
  9. 精通 Python 异常处理:try、except、else 与 finally 详解
  10. 精通 Python 异常处理:try、except、finally 与 raise 高效用法
  11. 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
  12. 精通 Java 异常处理:try-catch-finally 与资源管理