C++的异常处理机制主要用于在程序运行时处理错误或遇到的非预期情况
try块:将可能抛出异常的代码放在try块中。如果在try块中的代码抛出了异常,程序会立即跳转到相应的catch块。
catch块:用于捕获并处理特定类型的异常。catch块紧跟在try块之后,并指定要捕获的异常类型。当try块中的代码抛出异常时,C++运行时会查找与异常类型匹配的catch块。如果找到匹配的catch块,程序将执行该catch块中的代码。如果没有找到匹配的catch块,异常将继续向上层调用栈传播,直到被捕获或导致程序终止。
throw关键字:用于显式抛出异常。在程序中,如果遇到错误或非预期情况,可以使用throw关键字抛出一个异常对象。通常,异常对象是一个派生自std::exception的类,包含有关异常的详细信息。
std::exception类:C++标准库提供了一个名为std::exception的基类,它是所有标准异常类的基类。当创建自定义异常类时,通常继承自std::exception,并重写其what()成员函数以提供关于异常的详细信息。
析构函数是一种特殊的成员函数,它在对象的生命周期结束时被自动调用。析构函数在以下情况下被调用:
析构函数的定义与普通成员函数类似,但需要在类声明中指定其返回类型为void。析构函数不能有参数,也不能有返回值。在类定义中,析构函数的名称是在类名后加上波浪线(~)。
以下是一个简单的C++异常处理示例:
#include <iostream>
#include <stdexcept>
class MyException : public std::exception {
public:
const char* what() const noexcept override {
return "An error occurred";
}
};
void divide(int a, int b) {
if (b == 0) {
throw MyException();
}
std::cout << "Result: " << a / b << std::endl;
}
int main() {
try {
divide(10, 0);
} catch (const MyException& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,我们定义了一个名为MyException的自定义异常类,继承自std::exception。在divide函数中,我们检查除数是否为零,如果是,则抛出MyException异常。在main函数中,我们使用try-catch块捕获并处理MyException异常。