c++++标准库中的异常体系基于std::exception类构建,位于

C++标准库中的异常体系是基于 std::exception 类构建的,它位于 头文件中。这个类是所有标准异常类型的基类,开发者也可以从它派生自己的异常类。在实际编程中,我们通常会使用其派生出的具体异常类型来区分不同的错误情况。

下面是一些常用的异常类型及其适用场景,帮助你在不同情况下选择合适的异常类。

1. std::exception —— 所有标准异常的基类
这是 C++ 标准库中所有异常类的根类。它定义了一个虚函数 what(),用于返回描述异常的字符串信息:
立即学习“C++免费学习笔记(深入)”;
virtual const char* what() const noexcept;
虽然我们可以直接抛出和捕获 std::exception 对象,但通常更推荐使用其派生类,因为它们提供了更具体的错误信息。

2. 逻辑错误相关的异常类型
这些异常表示程序在运行前就可能发现的错误,通常是由于调用者传入了不合法的参数或违反了某种前提条件。
std::logic_error
这是逻辑错误类的基类,你可以从中派生自定义逻辑错误。std::invalid_argument
当函数接收到一个无效的参数时抛出。例如,将字符串转换为数字时输入了非数字字符。std::domain_error
表示函数的参数不在允许的定义域内。例如数学函数中负数开平方。std::length_error
当试图创建一个超出最大允许长度的对象时抛出,比如std::string的append方法。std::out_of_range
访问越界时抛出,例如使用vector::at()或map::at()访问不存在的元素。
3. 运行时错误相关的异常类型
这些异常表示在运行过程中发生的不可预测的问题,通常无法在编译阶段检测到。
std::runtime_error
运行时错误的基类。std::range_error
表示计算结果超出了可用范围,例如浮点数精度溢出。std::overflow_error / std::underflow_error
分别表示上溢和下溢错误,常用于数值计算中。std::regex_error
使用正则表达式时发生错误,比如语法错误。std::system_error
与系统底层操作相关的问题,如文件打开失败、网络连接中断等。它包含一个std::error_code来提供更多细节。
4. 其他特殊情况下的异常
除了上述两类之外,还有一些特殊的异常用于特定场景:
std::bad_alloc
当new操作符分配内存失败时抛出。std::bad_cast
在dynamic_cast转换失败时抛出(仅用于引用类型)。std::bad_typeid
如果对空指针执行typeid操作,会抛出此异常。std::bad_function_call
调用一个空的std::function对象时抛出。
如果你需要自定义异常类,建议从 std::exception 或其派生类继承,并重写 what() 方法。例如:
struct my_exception : public std::runtime_error {
my_exception() : std::runtime_error("Custom error occurred") {}
};这样可以保持异常体系的一致性,并方便统一处理。
基本上就这些,C++ 标准库提供的异常类型已经覆盖了大多数常见错误场景。合理使用这些异常类型,可以让代码更具可读性和健壮性。










