hwaityd的小窝

Loading...

异常处理

异常处理是一种程序结构,它允许程序在发生错误时继续执行,而不是立即终止。它由三个主要部分组成:try块、throw语句和catch块。

1. 检测try

概念try块是包围可能抛出异常的代码的语句块。
原理:编译器会生成额外的代码来检测try块中抛出的异常,并将其传递给匹配的catch块。
用法:使用try关键字来定义可能抛出异常的代码块。

2. 抛出throw

概念throw语句用于在发生错误时抛出一个异常。
原理throw语句会导致立即退出当前的try块,并开始搜索匹配的catch块。
用法:使用throw后跟异常对象来抛出异常。

3. 捕获catch

概念catch块用于捕获并处理异常。
原理:当异常被抛出时,程序会搜索匹配的catch块来处理这个异常。
用法:使用catch关键字后跟异常类型的参数来捕获异常。

4. C++标准异常:exception类

概念:C++标准库定义了一系列预定义的异常类,这些类都继承自exception类。
原理:这些异常类为常见的错误情况提供了标准的方式来抛出和捕获异常。
用法:可以直接使用这些异常类,也可以创建自定义异常类继承自它们。

5. 自定义异常类:

概念:自定义异常类允许开发者定义自己的异常类型,以提供更具体的异常信息。
原理:自定义异常类通常继承自exception类,并可以添加额外的数据成员和方法。
用法:定义一个继承自exception的类,并在抛出异常时使用这个类的实例。

完整案例代码

#include <iostream>
#include <exception>

using namespace std;

// 自定义异常类
class MyException : public exception {
private:
    string message;
public:
    MyException(const string& msg) : message(msg) {}
    
    // 覆盖 what() 方法以提供异常信息
    virtual const char* what() const throw() {
        return message.c_str();
    }
};

// 函数可能会抛出异常
void mightGoWrong(int value) {
    if (value < 0) {
        throw MyException("Negative value is not allowed");
    }
    cout << "Value is " << value << endl;
}

int main() {
    try {
        mightGoWrong(-1); // 这将抛出异常
    } catch (const MyException& e) {
        cout << "Caught an exception: " << e.what() << endl;
    } catch (const exception& e) {
        cout << "Caught a standard exception: " << e.what() << endl;
    }
    
    try {
        mightGoWrong(5); // 这将不会抛出异常
    } catch (const MyException& e) {
        cout << "Caught an exception: " << e.what() << endl;
    }
    
    return 0;
}

在这个案例中,我们定义了一个MyException类,它继承自exception类,并覆盖了what()方法以提供异常信息。mightGoWrong函数在接收到负数值时会抛出MyException。在main函数中,我们使用try-catch块来捕获并处理这些异常。如果mightGoWrong函数抛出了MyException,第一个catch块将捕获它并打印异常信息。如果抛出了其他类型的标准异常,第二个catch块将捕获并处理它。

posted on 2024-10-20 01:06  hwaityd  阅读(7)  评论(0编辑  收藏  举报