📜  C ++ |异常处理问题5(1)

📅  最后修改于: 2023-12-03 15:29:42.334000             🧑  作者: Mango

C++异常处理问题5

在C++中,异常处理是处理程序遇到错误的一种机制。在本文中,我们将探讨异常处理中的一个常见问题:如何捕获特定类型的异常。

异常类型

在C++中,有许多不同的异常类型,其中一些包括:

  • std::exception:这是所有标准C++异常的基类。它包含了一些基本的异常信息,如异常发生时的错误信息。

  • std::runtime_error:表示运行时错误,通常是由程序错误引起的。

  • std::logic_error:表示逻辑错误,通常是由编程错误引起的。

  • 其他自定义异常:你可以创建自己的异常类型,这些异常类型可以继承自std::exception。

捕获特定类型的异常

要捕获特定类型的异常,我们可以使用try-catch块。在try块中,我们编写可能抛出异常的代码。在catch块中,我们处理异常并执行必要的操作。以下是示例代码:

try {
  // 可能抛出异常的代码
}
catch (const std::exception& e) {
  // 处理std::exception异常
}
catch (const std::runtime_error& e) {
  // 处理std::runtime_error异常
}
catch (const std::logic_error& e) {
  // 处理std::logic_error异常
}
catch (...) {
  // 处理其他异常
}

在上面的代码中,我们首先使用一个try块,然后使用多个catch块捕获不同类型的异常。如果抛出的异常与任何catch块中指定的类型相匹配,则会执行相应的catch块。

请注意,最后一个catch块使用省略号(...)表示捕获所有其他类型的异常。这是为了确保即使我们没有列出所有可能的异常类型,我们的程序也不会崩溃。

示例

以下是实际示例代码,其中我们尝试将字符串转换为整数:

#include <iostream>
#include <stdexcept>

int main() {
  std::string str = "123abc";

  try {
    int num = std::stoi(str);
    std::cout << "转换后的数字为:" << num << std::endl;
  }
  catch (const std::invalid_argument& e) {
    std::cout << "无效的参数: " << e.what() << std::endl;
  }
  catch (const std::out_of_range& e) {
    std::cout << "超出范围: " << e.what() << std::endl;
  }
  catch (const std::exception& e) {
    std::cout << "发生错误: " << e.what() << std::endl;
  }

  return 0;
}

在上面的代码中,我们在try块中调用了std::stoi函数,该函数可以将字符串转换为整数。我们还使用了多个catch块,用于处理可能抛出的不同类型的异常。

结论

在C++中,异常处理是管理运行时错误的一种机制。通过使用try-catch块,我们可以捕获特定类型的异常,并执行必要的操作以处理错误。为了确保程序在遇到未知异常时不会崩溃,我们可以使用省略号(...)表示捕获所有其他类型的异常。