#include "stdafx.h" #include <iostream> template <typename T> T Div(T x,T y) { if(y==0) throw y;//抛出异常 return x/y; } int main() { int x=5,y=0; double x1=5.5,y1=0.0; try { //被检查的语句 std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl; std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl; } catch(int)//异常类型 { std::cout<<"除数为0,计算错误!"<<std::endl;//异常处理语句 } catch(double)//异常类型 { std::cout<<"除数为0.0,计算错误!"<<std::endl;//异常处理语句 } return 0; }
看了上述的示例代码,也许有人会问,第二个双精度类型的除法计算也应该抛出异常才对啊,在实际的运行过程中并非如此,其实该双精度类型除法函数根本没有被执行过。以上程序的执行规程为:调用函数Div(x,y)时发生异常,由函数Div中的语句"throw y"抛出异常,并不在往下执行return x/y,接着catch捕获int类型的异常并处理异常,最后直接执行"return 0"。因此函数Div(x1,y1)和catch(double){}模块根本没有被执行。如果,我们把y的值改为1,则结果就变成为:
如果在执行try语句模块时,没有发生异常,则catch语句块不起作用,流程转到其后的语句继续执行。从上述两个结果中可知第一次throw抛出的int类型所以找到处理该类型的catch,而第二次是抛出double类型所找到的是处理double类型的catch。