异常类:
1. <stdexcept>头文件
std::logic_error:程序逻辑错误的基类。
- std::domain_error: 当一个数学函数的输入参数超出函数的定义域时抛出。
- std::invalid_argument: 传递了无效的参数时抛出。
- std::length_error: 尝试创建超过最大允许大小的对象时抛出。
- std::out_of_range: 尝试访问容器中不存在的元素时抛出。
std::runtime_error:运行时错误的基类。
- std::overflow_error: 数学运算溢出时抛出。
- std::underflow_error: 数学运算下溢时抛出。
- std::range_error: 当计算结果的范围无法表示时抛出。
2. <new>头文件
- std::bad_alloc: 动态内存分配失败时抛出。
- std::bad_array_new_length: 尝试分配数组时,若长度无效或过大时抛出。
3. <typeinfo>头文件
- std::bad_cast: `dynamic_cast` 失败时抛出。
- 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>头文件
- std::bad_exception: 当异常处理程序遇到不可预知的异常时抛出。
- 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` 这一更具体的异常类派生。
在实际使用时,你可以根据需要选择最合适的基类来派生自己的异常类。