C++中的异常处理分为抛出和接收两个过程。抛出异常是指在程序执行过程中如果发生了错误或异常状态,程序会抛出异常信息,让接收处理程序捕获并进行处理。接收异常是指程序员编写的用于捕获并处理异常的代码。
在C++中,抛出异常一般使用throw
语句,这个语句后面跟着需要抛出的异常对象,可以是任何类型的对象,通常情况下我们使用字符串或整数类型作为异常类型。
接收异常需要使用try...catch
语句块,把可能抛出异常的代码放在try
语句块内,在执行try
语句块时,如果发现有异常抛出,则会跳出try
语句块,进入对应的catch
语句块中进行异常处理。
C++中的异常抛出和接收的顺序如下:
- 程序执行到
throw
语句时,会立即抛出异常信息,并立即跳出当前的函数或作用域; - 在当前函数或作用域外找到能够处理该异常的
catch
语句,进入对应的catch
语句块内部进行异常处理; - 如果没有找到能够处理该异常的
catch
语句,程序将结束运行,该异常将会成为未处理异常。
下面是两个示例说明:
第一个示例:
#include <iostream>
using namespace std;
void divide(int x, int y){
if(y == 0){
throw "Division by zero.";
}
cout << "x / y = " << x/y << endl;
}
int main(){
try {
divide(6, 0);
} catch (const char* s) {
cout << "Exception caught: " << s << endl;
}
return 0;
}
在上述代码中,我们定义了一个divide
函数来除法操作,当除数y
为0
时,函数会抛出一个字符串类型的异常信息。在main
函数中,我们调用divide(6, 0)
时会抛出一个异常,由于0
不能作为除数,程序将会执行throw "Division by zero."
语句,抛出一个字符串异常。接着程序会跳出divide
函数,并寻找对应的catch
语句,根据代码可以找到类似于catch (const char*)
的语句,该语句会捕获字符串类型的异常,然后对该异常进行处理。
运行上述代码,输出结果为:
Exception caught: Division by zero.
程序成功捕获并处理了异常信息。
第二个示例:
#include <iostream>
using namespace std;
void funcA(){
throw "Exception from funcA"; // 抛出异常
}
void funcB(){
try{
funcA();
}catch(const char* s){
cout << "Caught exception in funcB: " << s << endl;
throw; // 重新抛出异常
}
}
int main(){
try{
funcB();
}catch(const char* s){
cout << "Caught exception in main: " << s << endl;
}
return 0;
}
在这个示例中,我们定义了两个函数:funcA
和funcB
。其中funcA
函数抛出一个字符串类型的异常信息。funcB
函数调用funcA
函数,并在其中使用try...catch
语句块捕获funcA
中可能抛出的异常信息,并将异常信息重新抛出。main
函数则调用了funcB
函数,并使用try...catch
语句块捕获funcB
中抛出的异常信息。
运行上述代码,输出结果为:
Caught exception in funcB: Exception from funcA
Caught exception in main: Exception from funcA
从输出结果可以看出,当funcA
抛出异常时,程序跳出funcA
函数,并在funcB
函数中捕获该异常,然后重新抛出异常。这时,main
函数捕获了异常并进行处理。由此可见,在程序调用栈中,异常的抛出和接收顺序类似于逆序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++抛出和接收异常的顺序 - Python技术站