VC中的异常捕获的规则
可以捕获的异常有以下三种情况:
1. 必须严格遵守匹配数据类型
2. 异常处理的数据类型是公有类,抛掷的异常的数据类型是派生类。
3. 异常处理的数据类型是指向公有基类的指针,抛掷异常的数据类型是指向派生类的执针
对于派生层次结构的异常处理,catch块组的顺序是重要的。因为catch基类总能捕获throw派生类对象。所以catch基类块放在派生类快的后面。
使用异常的方法
可以把多个异常组成族系。把c++代码中的异常组在一起由两种方式:
4. 枚举族系
Enum FileErrors(nonsexist,wrongFormat,diskSeekError,…);
Int f()
{
Try
{
//--------------------------
Throw wrongFormat;
}
Catch(FileErrors fe)
{
Switch(fe)
{
Case nonsexist:
//--------------------
Case wrongFormat:
//---------------------
}
}
}
5. 按照异常派生层次结构
Class FileErrors{};
Class NonExist :public FileErrors{};
Class wrongFormat :public FileErrors{};
Int f()
{
Try
{//-------------
Throw wrongFormat;
}
Catch(nonExist)
{
//---------------
}
Catch(wrongFormat)
{
//-----------------------------
}
}
6. 跟在catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。如果一个函数抛掷一个异常,但在通往异常处理函数的调用链中找不到与之相匹配的catch,则程序通常以abort()函数调用结束。
7. 严格遵守匹配数据类型捕获异常示例
Throw 10; 会被catch (int)捕获
Throw “abc”;会被catch(char* ptr)捕获
Throw string(“def”);被catch(string s)捕获