C++---处理异常

C语言如何处理异常

#include<assert.h>

处理异常头文件
不同的返回值代表不同的错误

但是像1/0这样的操作无法实现报错

double Div(double a,double b)
{
    if(a==b)
        return -1;
//此语句必须要求a或者b的值不能为‘-1’!!不可能!!
    assert(0!=b);
//可以报错,但是只能在debug模式下可以使用,release版本就会被当作空语句
}

c++处理异常 

存在问题

double Div(double a,double b)
{
    if(0.0==b)
    {
        throw my_overflow_error("除0");
        //throw抛出异常关键字
        cout<<"throw"<<endl;//该语句在抛出异常后不执行
    }
    return a/b;
    cout<<"end"<<endl;//此语句不执行
}

解决:设计自己的异常类型

class my_overflow_error
{
private:    
    const char*m_what;
public:
    my_overflow_error() :m_what(nullptr) {}
    my_overflow_error(const char *msg) :m_what(msg) {}
    my_overflow_error() {m_what=nullptr;}
    ~my_overflow_error(const my_overflow_error&)=default;
    my_overflow_error&operator=(const my_overflow_error&) =default;//C++11
    const char* what()cont
    {
        return m_what ==nullptr ? "unknown exception" :m_what;
    }
};

 通过关键字抛出异常

double Div(double a,double b)
{
    if(0.0==b)
    {
//类型不匹配无法处理
        throw my_overflow_error("除0");
        //throw抛出异常关键字
        //my_overflow_error调用拷贝构造函数
        //构建一个匿名对象(异常对象)
    }
    return a/b;
    cout<<"end"<<endl;//此语句不执行
}
my_overflow_error(const my_overflow_error&)=default;//该函数为拷贝构造函数
//default表示默认的,默认的拷贝构造是按位构造
#include<vector>
#include<list>
#include<queue>
#include<stack>
#include<excpetion>//异常处理块头文件
ver.size//获取字节大小
int main()
{
    double a,y,z;
    cin >> x >> y ;
    try
    {
        z=Div(x,y);
        cout<<"z:"<<z<<endl;
    }
    catch(const my_overflow_error &e)//异常对象要和接受类型一致
    {
        cout<<e.what()<<endl;
    }
    return 0;   
}

如果类型不匹配无法处理,例如

double Div(double a,double b)
{
    if(0.0==b)
    {
        //throw my_overflow_error("除0");
        throw string(" 除0...!");
    }
    return a/b;
}

注:

  1. 一个异常可被多个catch块接收(参数匹配)
  2. 有try{} 测试块,catch{}才可被使用处理异常块。 
  3. 函数+const=常方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值