温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-30 16:45:03 来源:亿速云 阅读:210 作者:iii 栏目:编程语言

这篇文章主要介绍“C++程序运行时异常处理是怎样的”,在日常操作中,相信很多人在C++程序运行时异常处理是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++程序运行时异常处理是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

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

try {  被检查语句  throw 异常  }  catch(异常类型1)  {  进行异常处理的语句1  }  catch(异常类型2)  {  进行异常处理的语句2  }  ...

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

#include "stdafx.h"  #include <iostream>  template <typename T>  T Div(T x,T y)  {  if(y==0)  throwy;//抛出异常  returnx/y;}  intmain()  {  intx=5,y=0;  doublex1=5.5,y1=0.0;  try {//被检查的语句  std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  }  catch(int)//异常类型  {  std::cout<<"除数为0,计算错误!"<<std::endl;//异常处理语句  }  catch(double)//异常类型  {  std::cout<<"除数为0.0,计算错误!"<<std::endl;//异常处理语句  }  return0;  }

结果:

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

看了上述的示例代码,也许有人会问,第二个双精度类型的除法计算也应该抛出异常才对啊,在实际的运行过程中并非如此,其实该双精度类型除法函数根本没有被执行过。以上程序的执行规程为:调用函数Div(x,y)时发生异常,由函数Div中的语句"throw y"抛出异常,并不在往下执行return x/y,接着catch捕获int类型的异常并处理异常,***直接执行"return 0"。因此函数Div(x1,y1)和catch(double){}模块根本没有被执行。如果,我们把y的值改为1,则结果就变成为:

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

如果在执行try语句模块时,没有发生异常,则catch语句块不起作用,流程转到其后的语句继续执行。从上述两个结果中可知***次throw抛出的int类型所以找到处理该类型的catch,而第二次是抛出double类型所找到的是处理double类型的catch。

下面对异常处理补充几点:(1)try和catch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;(2)try和catch必须成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异常信息匹配;(3)如果在catch块中没有指定异常信息的类型,而用删节号"...",则表示它可以捕获任何类型的异常信息;(4)如果throw不包括任何表达式,表示它把当前正在处理的异常信息再次抛出,传给其上一层的catch来处理;(5)C++中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序

***还是一样,我将用一个示例来总结一下今天所讲的内容(开发工具:vs2010): 

#include "stdafx.h"  #include <iostream>  template <typename T>  T Div(T x,T y)  {  if(y==0)  throwy;//抛出异常  returnx/y;  }  intmain(){  intx=5,y=1;  doublex1=5.5,y1=0.0;  try {//被检查的语句  std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  }  catch(...)//捕获任意类型异常  {  try {  std::cout<<"任意类型异常!"<<std::endl;  throw;//抛出当前处理异常信息给上一层catch  }  catch(int)//异常类型  {  std::cout<<"除数为0,计算错误!"<<std::endl;//异常处理语句  }  catch(double)//异常类型  {std::cout<<"除数为0.0,计算错误!"<<std::endl;//异常处理语句  }  }  return0;  }

结果:

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

到此,关于“C++程序运行时异常处理是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI