C++ 范围外异常

2024 年 8 月 29 日 | 4 分钟阅读

异常是一种运行时错误,它会干扰程序遵循的常规指令。它是一种不期望在程序正常执行期间发生的不良事件。

发生超出范围异常的常见场景之一是,当使用小于零或大于或等于数据结构大小的索引访问数组或容器的元素时。在 C++ 中,我们可以使用 throw 关键字发出异常,并使用 try-catch 块处理它们。

try-catch 块是异常管理的基础。代码中任何可能发生异常的地方都被 try-catch 块包围。

当 C++ 编译器检测到程序问题时,try 关键字用于抛出异常。try 关键字指示发生该特定问题的代码部分,而 catch 关键字捕获异常。

程序可以抛出“超出范围”异常,这是一种常见的异常。标准库中的 vector、deque、string 和 bitset 模块在超出其预期范围时,也可以抛出异常。

如果向方法提供了任何不包含在预期值中的值,则会抛出称为“超出范围”的异常。它有助于了解异常背后的原因。

当尝试访问超出数据结构(例如数组、vector、字符串或其他容器)的允许范围或边界的元素时,C++ 中会引发“超出范围”异常。C++ 标准库的 std::out_of_range 异常类通常用于表示此类异常。以下是 C++ 超出范围异常背后的理论

1. std::out_of_range 异常类

  • C++ 预定义异常类 std::out_of_range 派生自 std::logic_error 基类。
  • 当尝试访问元素或执行超出允许范围的操作时,使用此技术处理错误。

2. 常见原因

  • 尝试访问超出数组边界的元素。
  • 使用负索引或大于或等于数组大小的索引。
  • 使用超出 std::vector 或其他容器大小的索引。
  • 使用指向有效元素范围之外的迭代器。
  • 尝试访问容器元素时到达不存在的位置。
  • 使用容器的 at 函数并提供超出范围的索引。
  • 使用带有不正确索引的 std::string::at() 尝试从字符串中提取字符。

3. 处理中

  • 您可以使用 try-catch 块来捕获 std::out_of_range 异常并通过适当的处理来管理它。它通常涉及设置错误消息和执行补救措施。

4. 预防

  • 在访问容器的任何元素之前检查容器的限制或大小是防止超出范围异常的好方法。如果您想确保访问在允许的边界内,可以使用 size()empty() 等函数。

示例

让我们举一个例子来说明 C++ 中 std::out_of_range 的用法

输出

Out of Range error: vector::_M_range_check: __n (which is 5) >= this->size() (which is 3)

说明

在这种情况下,当尝试使用 myVector.at(5) 访问向量中索引为 5 的元素时,会抛出 std::out_of_range 异常。此异常在 catch 块中被捕获和处理。

  1. 用于输入/输出操作(<iostream>)、vector 使用(<vector>)和异常管理(<stdexcept>)的头文件使用 #include 指令包含在内。
  2. 程序的入口点是 main()
  3. std::vector<int> myVector = {1, 2, 3}; 它创建了一个名为 myVector 的向量,其中包含三个整数成员 1、2 和 3。
  4. 可能抛出异常的代码被包含在 try 块中。at() 函数用于尝试访问位于索引 5 的向量元素,但由于向量在该位置没有元素,它将失败并抛出 std::out_of_range 异常。
  5. thrown 的 std::out_of_range 异常由 catch 块捕获。要捕获的异常类型在 const std::out_of_range &e 部分中指定,其中 e 是保存捕获的异常的变量。
  6. what() 方法在 catch 块中用于将包含异常描述的错误消息输出到标准错误流 (std::cerr)。
  7. return 0; 告诉 main 函数停止,因为程序已成功运行完毕。

下一个主题C++ 中的 strcoll()