C++ 异常处理


C++ 异常处理技术允许程序员在运行时对程序出现的意外错误进行捕获和处理,从而保证程序的稳定性和可靠性。C++的异常机制包含三个部分:抛出异常、捕获异常、异常处理。本文详细介绍C++ 异常处理的使用方法和相关特性。

一、抛出异常

在C++中,当程序执行到错误代码时,可以利用关键字throw和表达式来抛出异常。C++支持抛出任意类型的异常,例如整型、浮点型、字符串和对象等类型。

例如,以下代码段演示了如何抛出一个整型异常:

#include <iostream>
using namespace std;

int division(int a, int b) {
    if (b == 0) {
        throw 0;
    }
    else {
        return (a / b);
    }
}

int main() {
    int x = 10, y = 0, z;
    try {
        z = division(x, y);
        cout << z << endl;
    }
    catch (...) {
        cout << "Division by zero error." << endl;
    }
    return 0;
}

在上面的代码段中,当除数为0时,抛出一个整型异常0。抛出异常的方法是通过throw语句。

二、捕获异常

在C++中,异常被捕获的过程由try块和一或多个catch块组成。当某个异常被抛出时,控制流程会跳转到最近的try块之后的第一个catch块中。

例如,以下代码段演示了如何捕获一个整型异常:

#include <iostream>
using namespace std;

int division(int a, int b) {
    if (b == 0) {
        throw 0;
    }
    else {
        return (a / b);
    }
}

int main() {
    int x = 10, y = 0, z;
    try {
        z = division(x, y);
        cout << z << endl;
    }
    catch (int i) {
        cout << "Division by zero error. Exception Number : " << i << endl;
    }
    return 0;
}

在上面的代码段中,catch块接收整型异常,并输出错误信息。

三、异常处理

C++允许使用多个catch块来捕获不同类型的异常,实现针对不同异常的不同处理逻辑。

例如,以下代码段演示了如何处理多个异常类型的方法:

#include <iostream>
using namespace std;

int division(int a, int b) {
    if (b == 0) {
        throw "Division by zero error.";
    }
    else if (b < 0) {
        throw runtime_error("Negative denominator");
    }
    else {
        return (a / b);
    }
}

int main() {
    int x = 10, y = -1, z;
    try {
        z = division(x, y);
        cout << z << endl;
    }
    catch (const char* msg) {
        cerr << msg << endl;
    }
    catch (const runtime_error& e) {
        cerr << e.what() << endl;
    }
    return 0;
}

在上述代码段中,抛出两种类型的异常:字符串类型和运行时错误类型。使用两个catch块分别捕获这两种类型的异常,并输出错误信息。

总结

C++异常处理机制是一种强大的技术,可以通过抛出和捕获异常来保证程序的稳定性和可靠性。在编写C++代码时,我们应该根据不同的情况来选择适当的异常处理方式,以实现快速捕获和处理程序中的异常。