C++异常处理 try catch throw

程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:
1) 语法错误在编译和链接阶段就能发现,只有 100% 符合语法规则的代码才能生成可执行程序。


2) 逻辑错误是说我们编写的代码思路有问题,不能够达到最终的目标,这种错误可以通过调试来解决。


3) 运行时错误是指程序在运行期间发生的错误,例如除数为 0、内存分配失败、数组越界、文件不存在等。C++ 异常(Exception)机制就是为解决运行时错误而引入的。


运行时错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃(Crash)。C++ 提供了异常(Exception)机制,让我们能够捕获运行时错误,给程序一次“起死回生”的机会,或者至少告诉用户发生了什么再终止程序。(以上引用他人的)

Try{…}

Catch{…}

{}不可省略

throw中抛出异常

执行顺序:

1.首先执行try块内容;若没有异常,执行catch之后的内容。Catch块只在有异常并且类型匹配时才执行;

2.若执行的throw,一个异常对象得到创建;若在try块中,后面的catch执行类型匹配。

3.若在try’块外,或异常与类型不匹配,则回到当前函数调用点,重复寻找匹配类型的过程;

4.若最终没有找到,运行库函数terminate,终止程序;

#include 
   
   
    
    


using namespace std;
template
    
    
     
     
double devide(T a,T b) throw(string)
{
   if(b==0)
   {
       string c="b is zero";
       throw c;
   }
    return a/b;
}
int main()
{
    double b;
    try{

    b=devide(7.0,0.0);
    b=devide(7.0,1.1);
    }
    catch(int){
    }
//    catch (string v){
//        cout<
     
     
      
      <
      
      
     
     
    
    
   
   
输出:


类型匹配成功:

#include 
    
    
     
     

using namespace std;
template
     
     
      
      
double devide(T a,T b) throw(string)
{
   if(b==0)
   {
       string c="b is zero";
       throw c;
   }
    return a/b;
}
int main()
{
    double b=0;
    try{

    b=devide(7.0,0.0);
    b=devide(7.0,1.1);
    }
    catch(int){
    }
    catch (string v){
        cout<
      
      
       
       <
       
       
      
      
     
     
    
    
输出:
注意,
1.异常抛出后,try块内剩余内容不会得到执行,而try,catch体系后其他内容依旧会得到执行
2.异常执行顺序依照catch中其出现顺序,所以顺序很重要;
3.catch(...)应对所有异常
4.函数后还可以加入异常接口声明,指明该函数可以抛出什么异常,如抛出的不相符,执行unexpected函数,该函数默认调用函数terminate,终止程序。
没有声明,表示可以抛出任何异常;
throw()空的表明不会抛出异常;
5,catch内或其子函数,还可将异常继续抛出;写作throw;即可,抛出源对象,非副本;
6.异常抛出前,对所有构造的对象自动调用析构函数(unwinding);
7.异常的引发与处理不必在一个函数中;

异常的匹配条件:
1.catch的异常声明类型是抛出对象类型或引用
2.catch的异常声明类型是抛出对象类型的基类或引用
3.catch的异常声明类型,抛出对象类型,都是指针类型,且后者可以隐式转化为前者,如派生类指针转化为基类指针








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值