龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++程序运行时的异常处理

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,比如:句尾没有加分号,括号不匹配,关键字错误等,这类错误比较容易修改,因为编译系统会指出错

程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,比如:句尾没有加分号,括号不匹配,关键字错误等,这类错误比较容易修改,因为编译系统会指出错误在第几行,什么错误。而运行时的错误则不容易修改,因为其中的错误是不可预料的,或者可以预料但无法避免的,比如内存空间不够,或者在调用函数时,出现数组越界等错误。如果对于这些错误没有采取有效的防范措施,那么往往会得不到正确的运行结果,程序不正常终止或严重的会出现死机现象。我们把程序运行时的错误统称为异常,对异常处理称为异常处理。C++中所提供的异常处理机制结构清晰,在一定程度上可以保证程序的健壮性。

C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序。这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理。这使得底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理。

C++的异常处理机制有3部分组成:try(检查),throw(抛出),catch(捕获)。把需要检查的语句放在try模块中,检查语句发生错误,throw抛出异常,发出错误信息,由catch来捕获异常信息,并加以处理。一般throw抛出的异常要和catch所捕获的异常类型所匹配。异常处理的一般格式为:

  1. try 
  2. {  
  3. 被检查语句  
  4. throw 异常  
  5. }  
  6. catch(异常类型1)  
  7. {  
  8. 进行异常处理的语句1  
  9. }  
  10. catch(异常类型2)  
  11. {  
  12. 进行异常处理的语句2  
  13. }  
  14. ... 

下面我们用示例演示一下异常处理:

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. template <typename T>  
  4. T Div(T x,T y)  
  5. {  
  6. if(y==0)  
  7. throwy;//抛出异常  
  8. returnx/y;}  
  9. intmain()  
  10. {  
  11. intx=5,y=0;  
  12. doublex1=5.5,y1=0.0;  
  13. try 
  14. {//被检查的语句  
  15. std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  
  16. std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  
  17. }  
  18. catch(int)//异常类型  
  19. {  
  20. std::cout<<"除数为0,计算错误!"<<std::endl;//异常处理语句  
  21. }  
  22. catch(double)//异常类型  
  23. {  
  24. std::cout<<"除数为0.0,计算错误!"<<std::endl;//异常处理语句  
  25. }  
  26. return0;  

结果:


精彩图集

赞助商链接