C++异常类:编写自己的异常类

异常类:

1. <stdexcept>头文件

std::logic_error:程序逻辑错误的基类。

  1.  std::domain_error: 当一个数学函数的输入参数超出函数的定义域时抛出。
  2.  std::invalid_argument: 传递了无效的参数时抛出。
  3.  std::length_error: 尝试创建超过最大允许大小的对象时抛出。
  4.  std::out_of_range: 尝试访问容器中不存在的元素时抛出。

std::runtime_error:运行时错误的基类。

  1.  std::overflow_error: 数学运算溢出时抛出。
  2.  std::underflow_error: 数学运算下溢时抛出。
  3.  std::range_error: 当计算结果的范围无法表示时抛出。

2. <new>头文件

  1. std::bad_alloc: 动态内存分配失败时抛出。
  2. std::bad_array_new_length: 尝试分配数组时,若长度无效或过大时抛出。

3. <typeinfo>头文件

  1. std::bad_cast: `dynamic_cast` 失败时抛出。
  2. std::bad_typeid: 对一个 `nullptr` 使用 `typeid` 时抛出。

4. <functional>头文件

  • std::bad_function_call**: 调用空 `std::function` 对象时抛出。

5. <memory>头文件

  • std::bad_weak_ptr: 构造 `std::shared_ptr` 时,如果传入的 `std::weak_ptr` 无效则抛出。

6. <future>头文件

  • std::future_error: 处理 `std::future` 或 `std::promise` 对象时发生的错误。

7. <regex>头文件

  • std::regex_error: 处理正则表达式对象时发生的错误。

8. <system_error>头文件

  • std::system_error: 用于报告系统级错误条件。

9. <variant>头文件

  •  std::bad_variant_access: 访问 `std::variant` 对象的错误类型时抛出。

10. <optional>头文件

  • std::bad_optional_access: 访问空 `std::optional` 对象时抛出。

11. <exception>头文件

  1. std::bad_exception: 当异常处理程序遇到不可预知的异常时抛出。
  2. std::exception: 所有标准异常的基类。

12. 并发、同步和线程相关异常

        可能出现在 `<thread>`, `<mutex>`, `<condition_variable>`, `<shared_mutex>` 等头文件中。这些异常主要与线程创建、同步机制、条件变量等相关。

  • std::system_error**: 通常用于报告线程相关的错误,例如线程创建失败。

        每个异常类都提供有一个 `what()` 成员函数,该函数返回一个描述异常的字符串。在编写代码时,通常会在 `try` 块中放置可能抛出异常的代码,然后在 `catch` 块中处理异常。

编写自己的异常类:

        要创建自己的异常类,通常会从 `std::exception` 类或其派生类中继承,并重写 `what()` 函数。以下是创建自定义异常类的一个简单示例。

示例 1: 从 `std::exception` 直接继承

#include <iostream>
#include <exception>
#include <string>

class MyException : public std::exception {
private:
    std::string message;
public:
    MyException(const std::string& msg) : message(msg) {}

    // Override the what() function
    const char* what() const noexcept override {
        return message.c_str();
    }
};

int main() {
    try {
        throw MyException("This is my custom exception!");
    } catch(const std::exception& e) {
        std::cerr << e.what() << '\n';
    }
    return 0;
}

示例 2: 从一个具体的异常类派生

#include <iostream>
#include <stdexcept>
#include <string>

class MyOutOfRange : public std::out_of_range {
public:
    MyOutOfRange(const std::string& msg) : std::out_of_range(msg) {}
};

int main() {
    try {
        throw MyOutOfRange("Index is out of range!");
    } catch(const std::exception& e) {
        std::cerr << e.what() << '\n';
    }
    return 0;
}

        在上面的例子中,第一个例子展示了如何直接从 `std::exception` 派生自定义异常类,而第二个例子则展示了如何从 `std::out_of_range` 这一更具体的异常类派生。

        在实际使用时,你可以根据需要选择最合适的基类来派生自己的异常类。

猜你喜欢

转载自blog.csdn.net/crr411422/article/details/131165776