C++异常处理(exception)

在C++中,异常处理(Exception Handling)是一种用于处理程序运行时错误的机制。通过异常处理,程序可以在遇到错误时优雅地恢复或终止,而不是直接崩溃。C++中的异常处理主要通过trycatchthrow关键字来实现。

1. try

try块用于包含可能会抛出异常的代码。如果在try块中的代码抛出了异常,程序会立即跳转到与之匹配的catch块。

try {
    // 可能会抛出异常的代码
}

2. catch

catch块用于捕获并处理异常。每个catch块可以捕获特定类型的异常。当try块中的代码抛出异常时,程序会查找与异常类型匹配的catch块,并执行其中的代码。

catch (ExceptionType& e) {
    // 处理异常的代码
}

3. throw 语句

throw语句用于抛出异常。你可以抛出任何类型的异常,包括基本类型、对象或指针。

throw SomeException("An error occurred");

throw可以在任何地方抛出异常,但只有在try块中抛出的异常才会被对应的catch块捕获。如果异常在try块之外抛出,且没有被捕获,程序会调用std::terminate,导致程序终止。

4. 示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**************************************************************** 
 * 代码作者: Alex Li
 * 创建时间: 2025-03-03 04:56:07
 * 最后修改: 2025-03-03 05:21:05
 * 文件描述: C++异常处理
****************************************************************/
#include <iostream>
#include <stdexcept>
using namespace std;

// divide 函数用于执行除法运算,如果除数为零则抛出异常
double divide(double a, double b) {
    if (b == 0) {
        // 如果除数为零,抛出 invalid_argument 异常
        throw invalid_argument("Division by zero is not allowed");
    }
    return a / b; // 返回除法结果
}

int main() {
    double a = 10.0;
    double b = 0.0;

    try {
        // 尝试执行除法运算
        double result = divide(a, b);
        cout << "Result: " << result << endl; // 输出结果
    } catch (const invalid_argument& e) {
        // 捕获 invalid_argument 异常并输出错误信息
        cerr << "Error: " << e.what() << endl;
    } catch (...) {
        // 捕获所有其他类型的异常并输出通用错误信息
        cerr << "An unknown error occurred" << endl;
    }

    return 0; // 返回 0 表示程序正常结束
}

5. 解释

  • divide函数在除数为零时抛出一个std::invalid_argument异常。
  • main函数中的try块调用divide函数,并捕获可能抛出的异常。
  • 如果捕获到std::invalid_argument异常,程序会输出错误信息。
  • catch (...)用于捕获所有类型的异常,通常用于处理未知异常。

6. 标准异常类

C++标准库提供了一些内置的异常类,它们都继承自std::exception。常见的标准异常类包括:

  • std::runtime_error:运行时错误。
  • std::invalid_argument:无效的参数。
  • std::out_of_range:超出范围。
  • std::bad_alloc:内存分配失败。

7. 自定义异常类

你可以通过继承std::exception类来创建自定义异常类。

#include <iostream>
#include <exception>

class MyException : public std::exception {
public:
    const char* what() const noexcept override {
        return "My custom exception occurred";
    }
};

int main() {
    try {
        throw MyException();
    } catch (const MyException& e) {
        std::cerr << "Caught: " << e.what() << std::endl;
    }

    return 0;
}

8. 注意事项

  • 异常处理会增加程序的运行时开销,因此应谨慎使用。
  • 不要在析构函数中抛出异常,这可能导致程序终止。
  • 确保在catch块中正确处理异常,避免资源泄漏。

通过合理地使用异常处理机制,你可以编写出更加健壮和可靠的C++程序。

Scroll to Top