异常处理

异常处理

1. 使用try,catch处理异常

#include<iostream>
using namespace std;
int main(){
    double m,n;
    try{
        if(n==0)
            throw -1;    //抛出异常,如果抛出异常,则停止try的运行,进入catch
        else
            cout<<m/n<<endl; 
        cout<<1;
    }                   // 如果不抛出异常,则运行完try,运行catch后的语句
    catch(double& d){  //只会根据抛出的异常类型选择一个catch,如果都不符合,程序崩溃
        
    }
    catch(int &e){      
        
    }
    catch(...){       //这能catch任何类型的异常,异常匹配从上到下依次匹配
                      //所以这一般写在最后的地方
    }
    cout<<'1';        //这catch后的语句,无论是否抛出异常,都会执行
    return 0;
}

2. 异常的在抛出

如果一个函数在执行过程中,抛出的异常在本函数内就被catch块捕获处理了,那么该异常就不会抛给这个函数的调用者(也称上一层函数);如果异常在本函数中没被处理,就会被抛给上一层函数

#include <iostream>
#include<string>
using namespace std;
class CException{
public:
    string msg;
    CException(string s):msg(s){}
};
double Devide(double x,double y){    //函数内不处理异常
    if(y==0)
        throw CException("d") ;
    return x/y;         //如果抛出异常,如果函数没有catch则函数内下面语句全都不执行
}
int Count(int a){
    try{
        if(a<0)
            throw -1;
    }
    catch(int c){                //做出处理
        
    }
    return a*0.15;
}
int main(){
    double f=1.2,t;
    try{
        t=Count(-1);         //因为这个的异常,在函数中处理过了,所以在这不退出try
        f=Devide(3,0); //有异常,停止try,Devide函数没进行完就退出了,f没有进行赋值
        cout<<"1";
    }
    catch(CException e){
        cout<<"2";
    }
    cout<<"t的值为"<<t;       //这里的t有值
    return 0;
    cout<<f;                //这里f的值为1.2
}

2. 在c++标准异常类

c++标准库中有一些类代表异常,这些类都是从exception类派生而来,常用的几个异常类有

exception

  • bad_typeid 与类型判断有关
  • bad_cast 与类型转换有关
  • bad_alloc new运算符分配不成功出现的异常
  • ios_base::failure 输入输出产生错误
  • logic_error out_of_range 数组下标越界从 logic_error派生出来,用at访问

在使用这些时,写在try里就好,不用写throw,用catch

#include<iostream>
#include<stdexcept>
using namespace std;
int main(){
    try{
        char *p=new char[1000000];     //如果申请的太大,产生异常
        cout<<1;                      //如果产生异常,终止try
    }
    catch(bad_alloc&e){
        cout<<e.what()<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值