4. diagnostics (诊断与异常)
提供异常类、错误码与断言支持。本手册描述的头文件: <exception>, <stdexcept>(<system_error> 已移出,见下)。
注意:本章边界
4 / 4.1 的异常类可用 —— 类定义存在、可构造、
what()返回正常(链接并运行通过)。但throw/try/catch及"抛出"语义不可用:交付按-fno-exceptions运行,且 C++14 §15 [except] 整章不可用(硬偏差 D1)。库在无异常配置下多以abort()代替抛出。已从本章移出、不再描述用法:
rethrow_exception/make_exception_ptr—— 能链接,但一调用即终止(-fno-exceptions下转abort);- 4.2 系统错误整节(
<system_error>)—— 链接期失败,硬偏差 D11)。
class exception
所有标准异常的基类。
- 输入: 无
- 输出: 异常对象
- 注意:
what()返回描述字符串; 派生类应重写what()
virtual const char* what() const noexcept
获取异常描述。
- 输入: 无
- 输出:
const char*— 描述字符串 - 注意: noexcept; 返回值生命周期至少到异常对象被销毁
class bad_exception
意外异常类。
- 输入: 无
- 输出: 异常对象
- 注意: 当
unexpected_handler抛出非预期的异常时由系统抛出
typedef void (*terminate_handler)()
终止处理函数类型。
- 输入: 无
- 输出: 无
- 注意: 在异常处理失败时调用
terminate_handler set_terminate(terminate_handler f) noexcept
设置终止处理函数。
- 输入:
f— 新的终止处理函数 - 输出:
terminate_handler— 旧的终止处理函数
terminate_handler get_terminate() noexcept
获取当前终止处理函数。
- 输入: 无
- 输出:
terminate_handler— 当前处理函数
[[noreturn]] void terminate() noexcept
调用当前终止处理函数。
- 输入: 无
- 输出: 无(不返回)
- 注意: 通常调用 abort() 结束程序
bool uncaught_exception() noexcept
是否有未捕获的异常(废弃)。
- 输入: 无
- 输出:
bool - 注意: 已废弃
exception_ptr current_exception() noexcept
捕获当前异常。
- 输入: 无
- 输出:
exception_ptr— 指向当前异常的共享指针 - 注意: 可在 catch 块外保存异常
4.1 标准异常类 (stdexcept)
class logic_error : public exception
逻辑错误异常。
- 输入: 错误消息字符串
- 输出: 异常对象
- 注意: 表示程序逻辑错误,通常可预防
class domain_error : public logic_error
域错误。
- 输入: 错误消息字符串
- 输出: 异常对象
- 注意: 数学函数参数超出定义域
class invalid_argument : public logic_error
无效参数。
- 输入: 错误消息字符串
- 输出: 异常对象
class length_error : public logic_error
长度错误。
- 输入: 错误消息字符串
- 输出: 异常对象
- 注意: 请求长度超过 max_size()
class out_of_range : public logic_error
越界错误。
- 输入: 错误消息字符串
- 输出: 异常对象
- 注意: 由 at() 等函数在越界时抛出
class runtime_error : public exception
运行时错误。
- 输入: 错误消息字符串
- 输出: 异常对象
- 注意: 表示运行时条件错误
class range_error : public runtime_error
范围错误。
- 输入: 错误消息字符串
- 输出: 异常对象
class overflow_error : public runtime_error
溢出错误。
- 输入: 错误消息字符串
- 输出: 异常对象
class underflow_error : public runtime_error
下溢错误。
- 输入: 错误消息字符串
- 输出: 异常对象
4.2 系统错误 (system_error)
注意:本节整体【配置不可用 · 链接期失败】
<system_error>在本交付配置下整节不可链接(硬偏差 D11,与 D2 为同一限制):std::error_code/std::error_condition的默认构造即引用generic_category()/system_category(),二者依赖底层原子操作符号 —— 交付库中未提供。最小复现:
std::error_code ec;一句程序即链接失败(undefined symbol: __sync_val_compare_and_swap_1)。 故本节原列的 7 条实体(error_category/generic_category/system_category/error_code及其value·category·message·operator bool·clear/error_condition/system_error及其code)已从本手册移出、不再描述用法。详见 13.2 D11 / 13.7.1 L9。