1.1 C++异常简介
1.1.1 注意事项
- 异常不是错误,异常是C++中可以预料到的一条分支
- 错误是不期望出现的,是不可以预见的。
1.1.2 异常语法 - C++内置了异常处理的语法元素 try … catch
- try 语句中处理正常的代码逻辑
- catch 语句处理异常的情况
- try语言中的异常由对应的catch语句处理
try {
double r = divide(1,0); //如果这句出现异常,那么try语句块中后面的语句将不再执行
cout<<"123456"<<endl;
}
catch(...)
{
cout<< "divide by zero" <<endl;
}
double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = 0;
if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw 0; // 产生 除0 异常 ,产生异常后立即跳出,不会执行当前函数后面的程序
}
return ret;
}
1.1.3 C++中异常处理分析
- throw 抛出的一次必须被catch处理
- 当前函数能够处理异常,程序继续向下执行
- 当前函数无法处理异常,则函数停止执行,并返回
1.1.4 异常处理过程
- 未被处理的异常会顺着函数调用栈向上传播
- 直到被处理为止,否则程序将停止执行
1.1.5 - 同一个try语句可以跟上多个catch语句
- catch 语句可以定义具体处理的异常类型
- 不同类型的异常由不同的catch 语句负责处理
- try语句中可以抛出任何类型的异常
- catch(…)用于处理所有类型的异常
- 任何异常都只能被捕获(catch)一次
1.1.6 异常类型匹配规则
1.1.7 异常类型匹配规则举例
void func1()
{
try
{
throw 'a'; //严格的类型匹配,不能隐式转换
}
catch(int a)
{
cout<<"catch(int a)"<<endl;
}
catch(double b)
{
cout<<"catch (double b)"<<endl;
}
catch(char c)
{
cout<<"catch(char c)"<<endl;
}
catch(...){
cout<<"catch(...)"<<endl;
}
}
void func2()
{
throw "zhangsan" ;
}
int main()
{
// func1();
try{
func2();
}
catch(char *c)
{
cout<<"catch(char *c)"<<endl;
}
catch(const char *c)
{
cout<<"catch(const char *c)"<<endl; //正确答案
}
catch(...){
cout<<"catch(...)"<<endl;
}
return 0;
}
1.2 异常类构建
1.2.1 异常
- 异常的类型可以是自定义类型
- 对于类类异常的匹配依旧是
至上而下严格匹配
赋值兼容性原则
在异常匹配中依然适用- 一般而言
匹配子类异常的catch放在上面
匹配父类异常的catch放在下面
1.2.2 异常类族
- 现在C++库必然包含充要的异常类族
- 异常类时数据结构类所依赖的
基础设施
1.2.3 异常类功能定义
异常类 | 功能定义 |
---|---|
ArithmeticException | 计算异常 |
NullPointerException | 空指针异常 |
IndexOutOfBoundException | 越界异常 |
NoEnoughMemoryException | 内存不足异常 |
InvalidParameterException | 参数错误异常 |
1.2.4 异常类功能实现用到的函数
strdup 参考自 mfrbuaa
函数名: strdup
功 能: 将串复制到新建的位置处
用 法: char *strdup(char *str);
这个函数在linux的man手冊里解释为:
The strdup() function returns a pointer toa new string which is a
duplicate of the string s. Memory for thenew string is obtained with
malloc(3), and can be freed with free(3).
The strndup() function is similar, but onlycopies at most n charac-
ters. If s is longer than n, only ncharacters are copied, and a termi-
nating NUL is added.
strdup函数原型:
strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的參数不能为NULL,一旦为NULL,就会报段错误,由于该函数包含了strlen函数,而该函数參数不能是NULL。
strdup的工作原理:
char * __strdup (const char *s)
{
size_t len =strlen (s) + 1;
void *new =malloc (len);
if (new == NULL)
return NULL;
return (char *)memcpy (new, s, len);
}
1.3 注意事项
1.3.1
- 设计原则: 在可复用代码库设计时,尽量使用面向对象技术进行架构,尽量使用异常处理机制分离正常逻辑和异常逻辑。
参考一 : 狄泰软件课程
如有侵权:请联系邮箱 1986005934@qq.com