异常处理
异常处理是一种程序结构,它允许程序在发生错误时继续执行,而不是立即终止。它由三个主要部分组成:try
块、throw
语句和catch
块。
1. 检测try
概念:try
块是包围可能抛出异常的代码的语句块。
原理:编译器会生成额外的代码来检测try
块中抛出的异常,并将其传递给匹配的catch
块。
用法:使用try
关键字来定义可能抛出异常的代码块。
2. 抛出throw
概念:throw
语句用于在发生错误时抛出一个异常。
原理:throw
语句会导致立即退出当前的try
块,并开始搜索匹配的catch
块。
用法:使用throw
后跟异常对象来抛出异常。
3. 捕获catch
概念:catch
块用于捕获并处理异常。
原理:当异常被抛出时,程序会搜索匹配的catch
块来处理这个异常。
用法:使用catch
关键字后跟异常类型的参数来捕获异常。
4. C++标准异常:exception类
概念:C++标准库定义了一系列预定义的异常类,这些类都继承自exception
类。
原理:这些异常类为常见的错误情况提供了标准的方式来抛出和捕获异常。
用法:可以直接使用这些异常类,也可以创建自定义异常类继承自它们。
5. 自定义异常类:
概念:自定义异常类允许开发者定义自己的异常类型,以提供更具体的异常信息。
原理:自定义异常类通常继承自exception
类,并可以添加额外的数据成员和方法。
用法:定义一个继承自exception
的类,并在抛出异常时使用这个类的实例。
完整案例代码:
#include <iostream>
#include <exception>
using namespace std;
// 自定义异常类
class MyException : public exception {
private:
string message;
public:
MyException(const string& msg) : message(msg) {}
// 覆盖 what() 方法以提供异常信息
virtual const char* what() const throw() {
return message.c_str();
}
};
// 函数可能会抛出异常
void mightGoWrong(int value) {
if (value < 0) {
throw MyException("Negative value is not allowed");
}
cout << "Value is " << value << endl;
}
int main() {
try {
mightGoWrong(-1); // 这将抛出异常
} catch (const MyException& e) {
cout << "Caught an exception: " << e.what() << endl;
} catch (const exception& e) {
cout << "Caught a standard exception: " << e.what() << endl;
}
try {
mightGoWrong(5); // 这将不会抛出异常
} catch (const MyException& e) {
cout << "Caught an exception: " << e.what() << endl;
}
return 0;
}
在这个案例中,我们定义了一个MyException
类,它继承自exception
类,并覆盖了what()
方法以提供异常信息。mightGoWrong
函数在接收到负数值时会抛出MyException
。在main
函数中,我们使用try-catch
块来捕获并处理这些异常。如果mightGoWrong
函数抛出了MyException
,第一个catch
块将捕获它并打印异常信息。如果抛出了其他类型的标准异常,第二个catch
块将捕获并处理它。