第一章面向对象程序设计程序调试与异常处理_第1页
第一章面向对象程序设计程序调试与异常处理_第2页
第一章面向对象程序设计程序调试与异常处理_第3页
第一章面向对象程序设计程序调试与异常处理_第4页
第一章面向对象程序设计程序调试与异常处理_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序调试与异常处理

程序调试与异常处理语法错误的调试与BUG的调试异常处理块使用IDE对各种错误进行调试掌握C++异常处理机制,熟练编写异常处理块并进行处理1程序分为Debug版本和Release版本。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。2.6程序调试与异常处理2.6.1:程序调试2C++的错误大致可以分为两类,一类是编译器和连接器可以发现的语法错误。另一类是在没有语法错误的情况下,也可能会发生让程序无法正确运行的逻辑错误,习惯上将这种错误叫做BUG。代码编写完成后,源代码要被转换为计算机可以识别的指令,每个源文件都要被编译为中间文件,然后,所有的中间文件被链接成为.exe文件。2.6程序调试与异常处理2.6.1:程序调试3【生成】菜单中提供了生成解决方案相关的命令。【生成解决方案】命令让VisualStudio2005编译各个源文件,并将它们链接成为.exe文件或其他形式的程序文件。【重新生成解决方案】这个命令让编译器重新编译所有源文件,即使这些文件没有被修改过。【清理解决方案】命令用于清除解决方案在以前生成可执行文件时产生的旧文件。第一次生成解决方案时,源文件都会被编译一次,此后再生成解决方案时,如果某个源文件没被修改过,这个源文件将不会被重新编译。2.6程序调试与异常处理2.6.1:程序调试4生成一个解决方案后,会在【输出窗口】中显示日志,编译中发现的错误将会被列出。双击包含“error”的行,可以迅速切换到出错的代码。编译文件时,还可能出现另一种信息,即警告信息,这些警告提示了程序中潜在的错误。2.6程序调试与异常处理2.6.1:程序调试5VisualStudio2005有如下两个基本调试功能:找出BUG发生的地方。分析如何修改BUG。调试工具允许每次只执行一行程序代码,这样可以更方便地找到BUG发生的地方。调试工具具有以下3个基本功能:1)设置断点,跟踪程序段的执行。2)进入函数调用或跳过函数调用。3)设置监视窗口观察变量和表达式。2.6程序调试与异常处理2.6.1:程序调试6断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。可以在需要设置断点的程序行上用鼠标左键单击添加或移除断点2.6程序调试与异常处理2.6.1:程序调试7设置断点后,该行的左侧空白处将出现红色的小圆点,这是断点的标志。在单击移除之前,这个断点将永远存在。可以通过单击【调试】菜单中的【窗口】子菜单项,在弹出的子菜单中选择【断点】命令打开断点对话框,查看现在设置的所有断点的位置。2.6程序调试与异常处理2.6.1:程序调试8单击菜单【调试】→【启动】运行程序后,当程序运行到断点行时暂停执行。暂停执行时,当前代码行用箭头标示。鼠标移动到变量上时,会提示变量内容。同时也可以借助其他工具查看内存内容。2.6程序调试与异常处理2.6.1:程序调试9运行程序后,当执行到有断点的那一行时程序就会中断,这时可以有3种方法继续执行:1)按“F5”键继续执行,当遇到下一个断点的时候才会再次中断。2)按“F10”键继续执行,每次只单步执行,如果涉及到函数,不能进入到所执行的函数的内部。3)按“F11”键继续执行,也是单步执行,如果涉及到函数,能够进入到所执行的函数的内部。2.6程序调试与异常处理2.6.1:程序调试10监视监视窗口可以显示变量,对象和表达式在程序执行过程中值的变化情况。2.6程序调试与异常处理2.6.1:程序调试11监视窗口中,还可以单击左边的“+”号打开对象的数据成员,这样可以观察变量在窗口中的变化情况。另外,监视窗口也可以用来查看寄存器和编译器在编译程序时产生的代码。2.6程序调试与异常处理2.6.1:程序调试12调用堆栈调用堆栈反映了当前断点处函数是被哪些函数按照什么顺序调用的。在调用堆栈对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。2.6程序调试与异常处理2.6.1:程序调试13内存由于指针指向的数组在监视中只能显示第一个元素的值。为了显示数组的后续内容,可以打开内存对话框,在其中输入地址,就可以显示该地址指向的内存的内容。2.6程序调试与异常处理2.6.1:程序调试14局部变量显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量,以红色显示局部变量对话框内的内容是随着程序的执行自动进行内容更新的,不需要进行手动的调整。2.6程序调试与异常处理2.6.1:程序调试15寄存器显示当前的所有寄存器的值。寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。2.6程序调试与异常处理2.6.1:程序调试16断点显示程序内所有标有断点的位置2.6程序调试与异常处理2.6.1:程序调试17调试信息的设置不同的调试信息用于满足各种不同级别调试的需要。2.6程序调试与异常处理2.6.1:程序调试18在“调试信息格式”下拉列表框中可供选择的调试信息方式包括:1)禁用:没有调试信息。2)C7兼容:目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等。3)程序数据库:创建一个程序库文件(PDB格式),包括类型信息和符号调试信息。4)用于“编辑并继续”的程序数据库:除了具备程序数据库的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。5)从父级或项目默认设置继承:表示使用默认设置。2.6程序调试与异常处理2.6.1:程序调试19异常Exception是程序可能检测到的运行时刻不正常的情况,如被0除,数组越界访问或空闲存储内存耗尽等等。C++提供了内置的语言特性来产生并处理异常,这些语言特性将激活了一种运行时刻机制,通过这种机制可在C++程序的两个无关,常常是独立开发的部分进行异常通信。2.6程序调试与异常处理2.6.2:异常处理20抛出异常可通过throw表达式来实现,throw表达式看起来非常像return语句,throw表达式由关键字throw后面跟一个表达式构成,该表达式的类型是被抛出异常的类型。例如以下带代码抛出了不同类型的异常。throw10;//抛出整型throw3.4f;//抛出浮点型throw"ok";//抛出字符串2.6程序调试与异常处理2.6.2:异常处理21在抛出异常中,最常使用的是抛出一个异常类的对象。例如以下代码。#include<iostream>usingnamespacestd;classNumberExc{public: NumberExc(){cout<<"捕获到异常"<<endl;}};voidTestFunction(){ throwNumberExc();}intmain(){ return0;}2.6程序调试与异常处理2.6.2:异常处理22try块必须包围能够抛出异常的语句,try块以关键字try开始,后面是花括号括起来的语句序列,在try块之后是一组处理代码,被称为catch子句,try块把语句分成组,并将其与相应地处理这些语句可能抛出的异常的处理语句相关联。例如以下代码,try块将检测以下三个函数中是否有抛出的异常。 try

{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExc)

{

}2.6程序调试与异常处理2.6.2:异常处理23处理异常的的控制流下列几种情况之一:如果没有异常发生,则执行try块中的代码,和try块相关联的处理代码被忽略。如果第一个函数TestFunction1抛出一个异常,则后2个函数和try块被退出,执行NumberExc类型异常的处理代码。需要注意的是try块可以包含任何C++语句表达式以及声明,一个try块引入一个局部域,在try块内声明的变量不能在try块外被引用,包括在catch子句中。2.6程序调试与异常处理2.6.2:异常处理24终上所述,所以当某条语句抛出异常时,跟在该语句后面的语句将被跳过,程序执行权被转交给处理异常的catch子句。例如测试以下代码,可以看到抛出异常函数之后的函数都未运行。#include<iostream>usingnamespacestd;classNumberExc{public: NumberExc(){cout<<"捕获到异常"<<endl;}};voidTestFunction1(){ throwNumberExc();}voidTestFunction2(){ cout<<"function2"<<endl;}2.6程序调试与异常处理2.6.2:异常处理25voidTestFunction3(){ cout<<"function3"<<endl;}intmain(){ try

{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExc)

{

} return0;}2.6程序调试与异常处理2.6.2:异常处理26C++异常处理代码是catch子句,当一个异常被try块中的语句抛出时,系统通过查看跟在try块后面的catch子句列表,来查找能够处理该异常的catch子句。一个catch子句由三部分构成,关键字catch,在括号中的单个类型或单个对象声明被称作异常声明,以及复合语句中的语句。如果选择了一个catch子句来处理一个异常,则执行相应的复合语句。2.6程序调试与异常处理2.6.2:异常处理27当抛出的异常为类的时候,可以通过使用类的构造函数的办法让catch语句捕获到异常数据,例如以下代码。classNumberExc{public: NumberExc(int_n)

{ num=_n; cout<<"捕获到异常"<<endl;

} intnum;};voidTestFunction1(){ throwNumberExc(24);}2.6程序调试与异常处理2.6.2:异常处理28获得异常的数据就较为简单了,只需在catch子句中创建类对象,然后再复合语句中就能访问到了,例如以下代码。 try

{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExcne)

{ cout<<"错误代码为"<<ne.num<<endl;

}2.6程序调试与异常处理2.6.2:异常处理29异常处理机制中,通过throw语句抛出异常后,系统“跳转”到捕获异常的catch块去执行,而且在执行完那一catch块后将不再返回(到throw语句之后),继而转到catch块序列的最后一个catch块的“下一语句”处去执行。正是由于这种“跳转”后的不再返回,当抛出异常的throw语句处于某一下属层次的局部作用域(如某个局部块作用域或某个函数作用域)之中时,throw的“跳转”实际上相当于跳出了那些作用域,所以系统将自动检查在那些作用域中已经构造但尚未析构的处于堆栈中的局部对象(与变量),并自动进行相应的退栈与析构处理。2.6程序调试与异常处理2.6.2:异常处理30应把处理程序异常的代码与正常操作的实现分离开,因为这个策略会使得代码更易于跟随和维护。例如以下代码设计一个针对数字处理异常的类。classNumberExc{public: NumberExc()

{ cout<<"捕获到异常"<<endl;

} voidproZero(){cout<<"除数为"<<endl;} voidproMax(){cout<<"数字过大"<<endl;} voidproMin(){cout<<"数字过小"<<endl;}};2.6程序调试与异常处理2.6.3:异常处理的应用31使用这个类进行异常处理的代码如下。voidTestFunction2(intival){ if(0==ival) throwNumberExc();}try{ TestFunction1(); TestFunction2(); TestFunction3();}catch(NumberExcne){ Zero();}catch(NumberExcne){ Max();}catch(NumberExcne){ Min();}2.6程序调试与异常处理2.6.3:异常处理的应用32例如以下异常类,在抛出异常的时候会将一个异常代码传递到异常类的构造函数里。classNumberExc{public: NumberExc(int_excNum)

{ errorNum=_excNum; cout<<"捕获到异常"<<endl;

} voidproExc()

{ switch(ExcNum)

{ case0: cout<<"除数为"<<endl; break; case1: cout<<"数字过大"<<endl; break; case2: cout<<"数字过小"<<endl; break;

}

} intExcNum;};2.6程序调试与异常处理2.6.3:异常处理的应用33在可能发生异常的地方只需要要异常代码提供给抛出异常类的构造函数。voidTestFunction1(int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论