跳到主要内容

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。