try{
// 可能抛出异常的语句
}catch(exceptionType variable){
// 处理异常的语句
}
exceptionType variable
,这节就来详细分析一下。exceptionType
是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable
是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到底出了什么问题,接下来怎么处理。exceptionType variable
和函数的形参非常类似,当异常发生后,会将异常数据传递给 variable 这个变量,这和函数传参的过程类似。当然,只有跟 exceptionType 类型匹配的异常数据才会被传递给 variable,否则 catch 不会接收这份异常数据,也不会执行 catch 块中的语句。换句话说,catch 不会处理当前的异常。
try{
// 可能抛出异常的语句
}catch(exceptionType){
// 处理异常的语句
}
try{ //可能抛出异常的语句 }catch (exception_type_1 e){ //处理异常的语句 }catch (exception_type_2 e){ //处理异常的语句 } //其他的catch catch (exception_type_n e){ //处理异常的语句 }当异常发生时,程序会按照从上到下的顺序,将异常类型和 catch 所能接收的类型逐个匹配。一旦找到类型匹配的 catch 就停止检索,并将异常交给当前的 catch 处理(其他的 catch 不会被执行)。如果最终也没有找到匹配的 catch,就只能交给系统处理,终止程序的运行。
#include <iostream> #include <string> using namespace std; class Base{ }; class Derived: public Base{ }; int main(){ try{ throw Derived(); //抛出自己的异常类型,实际上是创建一个Derived类型的匿名对象 cout<<"This statement will not be executed."<<endl; }catch(int){ cout<<"Exception type: int"<<endl; }catch(char *){ cout<<"Exception type: cahr *"<<endl; }catch(Base){ //匹配成功(向上转型) cout<<"Exception type: Base"<<endl; }catch(Derived){ cout<<"Exception type: Derived"<<endl; } return 0; }运行结果:
catch(Derived)
捕获,但是从输出结果可以看出,异常提前被catch(Base)
捕获了,这说明 catch 在匹配异常类型时发生了向上转型(Upcasting)。
#include <iostream> using namespace std; int main(){ int nums[] = {1, 2, 3}; try{ throw nums; cout<<"This statement will not be executed."<<endl; }catch(const int *){ cout<<"Exception type: const int *"<<endl; } return 0; }运行结果:
int [3]
,但是 catch 中没有严格匹配的类型,所以先转换为int *
,再转换为const int *
。
本文链接:http://task.lmcjl.com/news/8735.html