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

C++异常处理全攻略:try/catch/throw机制、标准异常体系与自定义异常

异常:程序运行期出现的问题(如除零)。C++异常处理基于三关键字:try、catch、throw。

语法:

try { // 受保护代码 }
catch(ExceptionName e1) { /* 处理e1 */ }
catch(ExceptionName e2) { /* 处理e2 */ }
catch(ExceptionName eN) { /* 处理eN */ }

可列多个catch匹配不同异常类型。

抛出异常

任意代码处用throw抛出,操作数类型决定异常类型。除零示例:

double division(int a, int b) {
    if(b == 0) throw "Division by zero condition!";
    return a/b;
}

捕获异常

catch声明指定捕获类型:

try { /* protected */ }
catch(ExceptionName e) { /* 处理ExceptionName */ }

捕获任意类型异常用省略号:

try { /* protected */ }
catch(...) { /* 处理任意异常 */ }

完整除零捕获演示:

#include <iostream>
using namespace std;
double division(int a, int b) {
    if(b == 0) throw "Division by zero condition!";
    return a/b;
}
int main() {
    int x = 50, y = 0; double z = 0;
    try {
        z = division(x, y);
        cout << z << endl;
    } catch(const char* msg) { // 匹配const char*类型
        cerr << msg << endl;
    }
    return 0;
}

输出:Division by zero condition!

C++标准异常体系(定义于<exception>)

继承层级:C++异常处理全攻略:try/catch/throw机制、标准异常体系与自定义异常

序号异常与说明
1

std::exception

所有标准异常基类。

2

std::bad_alloc

new失败抛出。

3

std::bad_cast

dynamic_cast失败抛出。

4

std::bad_exception

处理意外异常的装置。

5

std::bad_typeid

typeid失败抛出。

6

std::logic_error

理论上读代码可检测的逻辑错误基类。

7

std::domain_error

数学定义域无效。

8

std::invalid_argument

无效参数。

9

std::length_error

过长string创建。

10

std::out_of_range

越界访问(如vector::at、bitset::operator[])。

11

std::runtime_error

理论上读代码无法检测的运行时错误基类。

12

std::overflow_error

数学上溢。

13

std::range_error

存储值超出范围。

14

std::underflow_error

数学下溢。

自定义异常

继承std::exception重写what():

#include <iostream>
#include <exception>
using namespace std;
struct MyException : public exception {
    const char* what() const throw() { return "C++ Exception"; }
};
int main() {
    try { throw MyException(); }
    catch(MyException& e) {
        cout << "MyException caught" << endl;
        cout << e.what() << endl;
    }
    catch(exception& e) { /* 其他标准异常 */ }
    return 0;
}

输出:MyException caught / C++ Exception。what()是异常类公共虚函数,所有派生类覆盖以返回错误原因。

C语言

  1. 掌握 C++ 运算符:六大类型全解析与实战示例
  2. C++ 注释最佳实践:编写可读、可维护代码的注释艺术
  3. C++ 类模板实战指南:编写灵活的类型无关代码
  4. C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
  5. C++ 异常处理实战:try、catch、throw 完整指南与示例
  6. C 语言错误处理最佳实践:errno、perror 与 strerror 详解
  7. C++编程语言:核心特性全景解析
  8. C++常量与字面量完全手册:类型、语法与最佳实践
  9. C++运算符大全:算术/关系/逻辑/位/赋值/杂项与优先级结合性
  10. C++数值类型实战指南:基本类型、数学函数与随机数生成
  11. 精通 Python 异常处理:try、except、finally 与 raise 高效用法
  12. 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解