<stdexcept>
头文件是 C++ 标准库中的一个头文件,它定义了一些标准异常类,这些异常类通常被用于表示 C++ 程序在运行时的错误。<stdexcept>
中定义的异常类都是从std::exception
类派生而来的,因此<stdexcept>
中定义的异常类都有一个通用的成员函数what()
,用于返回一个描述异常原因的 C 风格字符串。
下面是<stdexcept>
中定义的一些常用异常类:
-
std::logic_error
:表示程序逻辑错误,例如在程序逻辑上讲,调用了一个非法的函数,常见的子类包括std::invalid_argument
、std::domain_error
和std::length_error
等; -
std::runtime_error
:表示运行时错误,例如访问了一个无效的地址,常见的子类包括std::range_error
和std::overflow_error
等; -
std::bad_alloc
:表示内存分配失败,例如使用new
运算符分配内存时,没有足够的内存可供分配; -
std::bad_cast
:表示类型转换失败,例如在dynamic_cast
操作中类型不匹配; -
std::bad_exception
:表示未捕获的异常,例如在throw
语句中抛出了一个未定义异常。
这些异常类都是 C++ 标准库中预定义的类,使用时只需包含<stdexcept>
头文件,并从类中选择相应的异常类或者根据需求自定义异常类来使用即可。通过使用这些异常类,我们可以使代码更具表现力和准确性,以更容易地识别和处理可能出现的异常情况。
下面示范一个程序,程序的目的是从用户输入中读取两个整数,并计算它们的商。当除数为0时,我们抛出一个std::runtime_error
异常。代码如下:
#include <iostream> #include <stdexcept> int main() { int a, b; std::cout << "Please input two integers: " << std::endl; std::cin >> a >> b; try { if (b == 0) { throw std::runtime_error("Divisor cannot be 0."); } else { std::cout << "Result: " << a / b << std::endl; } } catch (std::runtime_error& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }
运行程序并输入一个除数为0的值,可以观察到程序抛出了一个std::runtime_error
异常并输出了异常信息。