C++ 自定义异常

C++ 自定义异常

C++ 自定义异常

1. 引言

在 C++ 中,我们可以使用异常来处理程序中的错误。C++ 提供了一些内置的异常类型,如 std::exception 和其派生类,但有时我们需要自定义异常类型以满足特定的需求。本文将详细介绍如何在 C++ 中自定义异常。

2. C++ 异常处理机制简介

异常处理是一种程序控制流的机制,用于在出现错误时进行处理,以确保程序的正确性和稳定性。在 C++ 中,异常处理机制包括以下几个关键字:

  • try:代码块,用于标识可能会引发异常的代码段。
  • catch:代码块,用于捕获和处理抛出的异常。
  • throw:用于引发异常的关键字。

下面是异常处理机制的基本语法:

try {
    // 可能引发异常的代码
} catch (ExceptionType1 e1) {
    // 异常处理代码
} catch (ExceptionType2 e2) {
    // 异常处理代码
} catch (...) {
    // 捕获所有其他类型的异常
}

3. 自定义异常类

在 C++ 中,我们可以通过自定义异常类来满足特定的需求。自定义异常类应该从标准异常类 std::exception 派生,以符合异常处理机制的要求。

下面是自定义异常类的基本结构:

class MyException : public std::exception {
public:
    MyException(const char* message) : std::exception(message) {}

    virtual const char* what() const throw() {
        return "MyException occurred";
    }
};

在上面的代码中,我们定义了一个名为 MyException 的自定义异常类,它继承自 std::exception。我们在构造函数中接收错误信息,并将其传递给基类 std::exceptionwhat 函数用于返回异常的字符串描述。

4. 抛出异常

在需要引发异常的地方,我们可以使用 throw 关键字抛出自定义异常。下面是示例代码:

void checkNumber(int number) {
    if (number < 0) {
        throw MyException("Negative number not allowed");
    }
}

在上面的代码中,我们定义了一个名为 checkNumber 的函数,它接收一个整数作为参数。如果参数为负数,则抛出自定义异常 MyException

5. 捕获异常

在引发异常之后,我们可以使用 catch 关键字来捕获并处理异常。下面是示例代码:

int main() {
    try {
        checkNumber(-5);
    } catch (MyException& e) {
        std::cout << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

在上面的代码中,我们在 main 函数中调用了 checkNumber 函数,并在 try 代码块中捕获了 MyException 异常。如果 checkNumber 函数引发了异常,则该异常将由 catch 代码块中的语句捕获和处理。

示例代码的输出为:

Exception caught: MyException occurred

6. 捕获多个异常类型

在异常处理过程中,我们还可以捕获多个不同类型的异常,并针对每种异常类型编写对应的处理代码。下面是示例代码:

void checkNumber(int number) {
    if (number == 0) {
        throw MyException("Zero not allowed");
    } else if (number < 0) {
        throw std::runtime_error("Negative number not allowed");
    } else {
        std::cout << "Number is valid" << std::endl;
    }
}

int main() {
    try {
        checkNumber(-5);
    } catch (MyException& e) {
        std::cout << "MyException caught: " << e.what() << std::endl;
    } catch (std::exception& e) {
        std::cout << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

在上面的代码中,我们重新定义了 checkNumber 函数。如果参数为零,则抛出自定义异常 MyException,否则,如果参数为负数,则抛出标准异常 std::runtime_error

main 函数中的 catch 代码块中,我们分别捕获了 MyExceptionstd::exception 异常,以便根据实际情况进行处理。示例代码的输出为:

MyException caught: Zero not allowed

7. 总结

本文介绍了如何在 C++ 中自定义异常,并使用异常处理机制来处理程序中的错误。通过自定义异常类,我们可以更好地适应特定的需求。在编写程序时,合理地使用异常处理机制可以提高程序的可维护性和健壮性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程