Try-throw-catch的基本用法如下代码段,也即thorw什么类型的异常,就捕捉到什么类型的异常,并进行什么类型的处理。注意,catch是要按顺序排列的,某一类型异常派生自另一类型异常,则另一类型异常一定要放在前者后面,否则异常不会被前者处理。
int i = 0;
cin >> i ;
try
{
switch(i)
{
case 1:
{
throw(1);
}
break;
case 2:
{
throw(1.0);
}
break;
case 3:
{
throw('a');
}
break;
default:
break;
}
}
catch(int)
{
cout << "int" << endl;
}
catch(double)
{
cout << "double" << endl;
}
catch(char)
{
cout << "char" << endl;
}
当catch(…)表示处理任何错误。
6.2 Catch块的触发
Try
{
Throw e();
}
Catch(h)
{
//……
}
当以下情况会触发catch块:
1) e与h是相同类型。
2) h是e公共基类,也即e是直接public继承或是间接public继承h。
直接public继承:
Class base;
Class a:public base;
则a直接public继承base。
间接public继承:
Class base;
Class a:public base;
Class aa:public a;
则aa间接public继承。
3) h、e是指针类型,且1)、2)对它们所引用的类型成立。
4) h、e是引用类型,且1)、2)对它们所引用的类型成立。(《c++ programming language》中原意是“h是引用类型,且1)、2)对它们所引用的类型成立”,经测试,发觉此话有误。
6.3 重新抛出异常
在catch块中throw一个不带参数的异常出来,重新抛出的就是原来捕捉的那个异常。
6.4 资源管理的异常
一些操作,诸如文件操作,在文件open后close前如有异常也可捕捉进行处理。
6.5 构造函数里的异常与初始化器的异常
代码可以分别如下:
classA::classA()
{
Try
{
//…
}
Catch(s)
{
//…
}
}
classA::classA()
try
{
:data(d)
{
}
}
Catch(s)
{
//…
}
参考:《c++ programming language》特别版。