在C++中,异常处理机制是一种用于处理程序运行时错误的方法。当程序遇到错误情况时,可以通过抛出异常(throw)来中断正常的程序流程,然后在适当的地方捕获异常(catch)并进行处理。C++的异常处理机制主要包括以下关键字和概念:
1. try, catch, throw
- try: try 块用于包围可能引发异常的代码。如果 try 块内的代码引发了异常,控制流会跳转到与异常匹配的 catch 块。
try {
// 可能引发异常的代码
} catch (ExceptionType e) {
// 处理异常的代码
}
- catch: catch 块用于捕获并处理异常。当 try 块内的代码引发了与 catch 中指定的异常类型匹配的异常时,相应的 catch 块会被执行
try {
// 可能引发异常的代码
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 类型的异常
} catch (...) {
// 处理其他类型的异常
}
- throw: throw 用于抛出异常。当程序执行到 throw 语句时,会立即跳转到匹配的 catch 块,或者终止程序执行(如果没有匹配的 catch 块)
if (error_condition) {
throw ExceptionType("Error message"); // 抛出异常
}
2. 异常类
异常通常是由用户定义的异常类(Exception Class)的实例对象抛出的。这些异常类必须是C++的类,可以从标准库的 std::exception 类派生,也可以是任何其他自定义的类。
class MyException : public std::exception {
public:
virtual const char* what() const throw() {
return "My custom exception occurred";
}
};
3. 自定义异常类案例
以下是一个自定义异常类的案例:
#include <iostream>
using namespace std;
#include <stdexcept>
class MyException : public exception {
public:
virtual const char* what() const throw() {
return "My custom exception occurred";
}
};
void process(int value) {
if (value < 0) {
throw MyException(); // 抛出自定义异常
}
// 处理正常情况
cout << value << endl;
}
int main()
{
try {
int value = -1;
process(value);// 可能引发异常的代码
}
catch (const MyException& e) {
cerr << "Caught exception: " << e.what() << endl;
}
catch (const exception& e) {
cerr << "Caught standard exception: " << e.what() << endl;
}
return 0;
}
在这个示例中,process 函数可能引发 MyException 异常,而 main 函数使用 try 块包围了可能引发异常的代码。如果 process 函数引发了 MyException 异常,它将被第一个 catch 块捕获并处理,输出异常信息。如果 process 函数引发了其他继承自 std::exception 的异常,它将被第二个 catch 块捕获并处理。
这个例子演示了如何使用 try、catch 和 throw 来处理自定义异常和标准异常。
这段代码会输出: Caught exception: My custom exception occurred
(我会在下篇文章解释下cerr和what() 虚函数是什么)
4. 标准异常类
C++标准库提供了一些常用的异常类,它们都派生自 std::exception:
- std::runtime_error:表示在运行时发生的错误。
- std::logic_error:表示程序逻辑错误,例如违反了先决条件。
- std::out_of_range:表示访问超出有效范围的数据结构的元素。
这是一个使用异常处理机制的示例:
#include <iostream>
#include <stdexcept>
int main() {
try {
int divisor = 0;
if (divisor == 0) {
throw std::runtime_error("Division by zero");
}
int result = 10 / divisor;
std::cout << "Result: " << result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,如果 divisor 为零,会抛出一个 std::runtime_error 异常,然后被 catch 块捕获并输出异常信息。