好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

嵌入式linux下c++程序设计--09异常处理.ppt

16页
  • 卖家[上传人]:kms****20
  • 文档编号:51683700
  • 上传时间:2018-08-15
  • 文档格式:PPT
  • 文档大小:1.10MB
  • / 16 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 嵌入式Linux下QT程序设计主讲:成宝宗主要内容:异常处理机制 异常实现 异常执行过程 异常接口声明 异常处理中的构造与析构异常处理的实现 机制抛掷异常的程序段throw 表达式;捕获并处理异常的程序段 try复合语句 catch(异常类型声明)复合语句 catch(异常类型声明)复合语句…示例:#include using namespace std; int fun(int x, int y){//抛出异常  if (y == 0)throw y;  return x/y; } int main(int argc, char *argv[]) {  try{//捕获异常  cout ;  当某段程序发现 了自己不能处理的异常,就可以 使用throw语句将这个异常抛掷给调 用者throw 语句的使用与return语句相似,如果程序中有多处 要抛掷异常,应该 用不同的表达式类型来互相区 别,表达式的值不能用来区别不同的异常2.try块语 法  try  {  复合语句  }  try语句后的复合语句是代码的保护段。

      如果预 料某段程序代码(或对某个函数的调用)有可能发生 异常,就将它放在try语句之后如果这段代码(或 被调函数)运行时真的遇到异常情况,其中的 throw表达式就会抛掷这 个异常 异常处理的实现3.catch语法catch(异常类型1参数1){//针对异常类型1的处理语句}catch(异常类型2参数2){//针对异常类型2的处理语句}.catch(异常类型n参数n)  { //针对异常类型n的处理语句  }  catch语句后的复合语句是异常处理程序,捕获由throw表达式抛掷的异常异常类型声明部分指明 语句所处理的异常类型,它与函数的形参相类似,可以是某个类型的值,也可以是引用这里的类 型可以是任何有效的数据类型,包括C++的类当异常被抛掷以后,catch语句便依次被检查 异常处理的实现 异常处理的执行过程如下:  ①控制通过正常的顺序执行到达try语句,然后执行 try块内的保护段  ②如果在保护段执行期间没有引起异常,那么跟在 try块后的catch语句就不执行,程序从异常被抛掷的 try块后跟随的最后一个catch语句后面的语句继续执 行下去。

       异常处理的执行过程 ③如果在保护段执行期间或在保护段调用的任 何函数中(直接或间接的调用)有异常被抛掷,则从 通过throw创建的对象中创建一个异常对象(这隐 含指可能包含一个拷贝构造函数) 这一点上,编译 器能够处 理抛掷类 型的异常,在 更高执行上下文中寻找一个catch语句(或一个能处 理任何类型异常的catch处理程序)catch处理程 序按其在try块后出现的顺序被检查 如果没有找 到合适的处理程序,则继续检查 下一个动态 封闭 的try块此处理继续 下去,直到最外层的封闭try 块被检查 完异常处理的执行过程 ④如果匹配的处理器未找到,则terminate()将被 自动调 用,而函数terminate()的默认功能是调用 abort终止程序  ⑤如果找到了一个匹配的catch处理程序,且它通 过值进 行捕获,则其形参通过拷贝异常对象进行 初始化如果它通过引用进行捕获,则参量被初 始化为指向异常对象,在形参被初始化之后,“循 环展开栈”的过程开始这包括对那些在与catch 处理器相对应 的try块开始和异常丢弃地点之间创 建的(但尚未析构的)所有自动对 象的析构。

      异常处理的执行过程为了加强程序的可读性,使用户能够方便地知道所使用的 函数会抛掷哪些异常,可以在函数的声明中列出这个函数 可能抛掷的所有异常类型例如: voidfun()throw(A,B,C,D) 这表明函数throw()能够且只能够抛掷类 型A、B、C、D的 异常 如果在函数的声明中没有包括异常接口声明,则此函数可以 抛掷任何类型的异常  例如:void fun();一个不抛掷任何类型异常的函数可以进行如下形式的声明:void fun() throw();异常接口声明异常处理中的构造与析构C++异常处理的真正能力不仅在于它能够处 理各种不同类型的 异常,还在于它具有在异常抛掷前为构造的所有局部对象自动 调用析构函数的能力 在程序中,找到一个匹配的catch异常处理后,如果catch语句 的异常类型声明是一个值参数,则其初始化方式是复制被抛掷 的异常对象;如果catch语句的异常类型声明是一个引用,则其 初始化方式是使该引用指向异常对象当catch语句的异常类型声明参数被初始化后,栈的展开过程便 开始了这包括从对应 的try块开始到异常被抛掷处 之间对 构 造(且尚未析构)的所有自动对 象进行析构。

      析构的顺序与构造 的顺序相反然后程序从最后一个catch处理之后开始恢复执行 #include using namespace std; void MyFunc( void ); class Expt { public:  Expt(){};  ~Expt(){};  const char *ShowReason() const  { return “Expt类异常  } }; class Demo { public:  Demo();  ~Demo(); }; Demo::Demo() {  cout<<“构造 Demo.“<

      <

      在很多情况下,只 要通知处理程序有某个特定类型的异常已经产 生就足够了但是 在需要访问 异常对象时就要说明参量,否则,将无法访问 catch 处理程序语句中的那个对象例如: catch(Expt) { //在这里不能访问 Expt异常对象 } 用一个不带操作数的throw表达式可以将当前正被处理的异 常再次抛掷 这样 一个表达式只能出现在一个catch处理程序中或catch处 理程序内部调用的函数中再次抛掷的异常对象是源异常 对象(不是拷贝)例如: try { throwCSomeOtherException(); } catch(.)//处理所有异常 { //对异常作出响应(也许仅仅 是部分的) //. throw;//将异常传给 某个其它处理器 }。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.