C++

C++ 知识量:19 - 82 - 316

5.5 try语句块和异常处理><

throw表达式- 5.5.1 -

在C++中,throw关键字用于抛出一个异常。当代码执行到throw语句时,程序的执行流程会立即跳转到最近的异常处理程序(catch块)。

throw后面可以跟任何类型的表达式,这个表达式就是被抛出的异常对象。下面是一个简单的例子:

#include <iostream>  
#include <stdexcept>  
  
int main() {  
    try {  
        throw std::runtime_error("A problem occurred");  
    } catch (const std::runtime_error& e) {  
        std::cout << "Caught an exception: " << e.what() << std::endl;  
    }  
    return 0;  
}

在这个例子中,使用throw抛出了一个std::runtime_error异常。这个异常对象包含一个字符串消息"A problem occurred"。然后,使用try-catch块来捕获这个异常并处理它。在catch块中,打印出了异常的消息。

try语句块- 5.5.2 -

在C++中,try语句块用于处理可能会抛出异常的代码。try块中包含可能抛出异常的代码,而catch块用于捕获和处理这些异常。这种结构允许程序在运行时检测错误,并且可以提供更好的错误处理和程序控制。

下面是一个简单的try-catch语句块的示例:

#include <iostream>  
#include <stdexcept>  
  
int main() {  
    try {  
        // 在这里放置可能抛出异常的代码  
        throw std::runtime_error("A problem occurred");  
    } catch (const std::runtime_error& e) {  
        // 处理异常的代码  
        std::cout << "Caught an exception: " << e.what() << std::endl;  
    }  
    return 0;  
}

在上面的示例中,try块中包含了一个throw语句,它抛出了一个std::runtime_error异常。这个异常对象包含一个消息字符串"A problem occurred"。然后,catch块捕获了这个异常,并打印出了异常的消息。

当程序执行到throw语句时,它会立即跳转到最近的catch块。在这个例子中,程序跳转到catch块并执行里面的代码。如果没有找到匹配的catch块,程序将终止并显示未捕获的异常消息。

标准异常- 5.5.3 -

C++标准库提供了一组基本的异常类,这些类定义在<exception>头文件中。这些基本的异常类包括:

  • std::exception:这是所有标准异常类的基类。它提供了两个虚函数:what(),返回一个指向C风格字符串的指针,该字符串表示异常的描述;clone(),返回一个指向异常对象(与原始异常对象相同类型)的指针。

  • std::bad_exception:当异常处理程序无法识别异常类型时,或者在从异常对象中提取信息时失败时,抛出此异常。

  • std::bad_typeid:当对一个类型信息对象调用typeid操作符,但该对象没有类型信息时,抛出此异常。

  • std::domain_error:当函数域错误时抛出此异常。

  • std::invalid_argument:当函数接受无效的参数时,抛出此异常。

  • std::length_error:当函数试图产生一个超出其容量限制的结果时,抛出此异常。

  • std::logic_error:当函数执行错误逻辑时,抛出此异常。

  • std::out_of_range:当数组、vector容器等超出其范围时,抛出此异常。

  • std::overflow_error:当算术运算的结果太大,无法表示时,抛出此异常。

  • std::range_error:当函数试图访问一个无效范围时,抛出此异常。

  • std::underflow_error:当算术运算的结果太小(下溢)时,抛出此异常。

这些异常类都是从std::exception派生的,因此它们都继承了std::exception的虚函数。这使得程序员可以编写处理这些异常的代码,而不必关心具体的异常类型。在大多数情况下,这些标准异常类应该足够满足需求,可以直接使用或继承。