数据结构(四)之异常

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值