已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章程序调试与异常处理 内容简介 在应用程序开发过程中 错误总是难免的 程序中的错误最好是在运行之前 如编译时 发现 但是有些错误却必须在运行时解决 程序在运行时发生的错误称为异常 C 的异常处理机制可以较好地对异常进行处理 从而确保程序的健壮性 本章主要介绍程序的调试和异常处理的基本知识 目录 9 1程序错误与程序调试 9 2异常处理 9 3本章小结 9 1程序错误与程序调试 在应用程序开发过程中 程序出现错误是很常见的问题 VisualStudio NET2008提供了良好的调试程序错误的功能 可以帮助编程人员快速地查找程序中的错误并进行修改 9 1 1程序错误1 语法错误语法错误是指在代码编写时出现的错误 是所有错误中最容易发现和解决的一类错误 此类型的错误通常发生在编程人员对C 语言本身的熟悉度不足 在程序设计过程中出现不符合语法规则的程序代码 例如关键字写错 标点漏写 括号不匹配等 如图9 1所示 9 1程序错误与程序调试 9 1 1程序错误1 语法错误 9 1程序错误与程序调试 9 1 1程序错误1 语法错误在代码编辑器中 每输入一句语句 VisualStudio NET2008编辑器都能够自动指出语法错误 并会用波浪线在错误代码的下方标记出来 当把鼠标指针移到带波浪线的代码上时 鼠标指针附近就会出现一条简短的错误描述提示 错误列表 窗口也可以提示错误信息 选择 视图 菜单下的 错误列表 命令 可以显示 错误列表 窗口 在 错误列表 窗口中包含错误描述 发生错误的文件路径以及错误所在的行号等 其中的错误描述 与把鼠标指针指向 代码编辑器 中带波浪线的那部分代码时所看到的信息一样 如图9 1所示 在 错误列表 窗口中双击对应的条目 插入点将精确定位在发生错误的文件中相应的错误代码上 然后就可以修改代码了 一旦完成了修改并把光标从修改行移开后 错误列表 窗口将会更新 9 1程序错误与程序调试 9 1 1程序错误2 运行时错误运行时错误是指在应用程序运行时产生的错误 这种错误通常涉及那些看起来没有语法错误 却不能运行的代码 多数可以通过重新编写和编译代码解决 这类错误编译器是无法检查出来的 通常需要对相关的代码进行人工检查并更正 运行时错误多数发生在不可预期的异常 例如 打开硬盘上的某个文件时 该文件不存在 向硬盘上写某个文件的时候 硬盘的空间不足 用户不按正确的步骤操作而造成的错误 如除数为零 访问数组的时候 超出了可访问下标的范围 调用一个方法 给它传递错误的参数 9 1程序错误与程序调试 9 1 1程序错误2 运行时错误当程序执行时 如果产生异常 就会出现提示错误信息的对话框 例9 1 被零除异常 针对运行时错误的类型 编程人员应该在开发阶段确认是否可能发生异常 更常用的捕捉异常的方法 则是利用try catch finally结构来处理 9 1程序错误与程序调试 9 1 1程序错误3 逻辑错误逻辑错误是程序算法的错误 指应用程序运行所得的结果与预期不同 如果产生这种错误 程序不会发生任何程序中断或跳出程序 而是一直执行到最后 可能会有结果 但是执行结果是不对的 这是最难修改的一种错误 因为发生的位置一般都不明确 逻辑错误通常不容易发现 常常是由于其推理和设计算法本身的错误造成的 这种错误的调试是非常困难的 因为程序员本身认为它是对的 所以只能依靠细心的测试以及调试工具的使用 甚至还要适当地添加专门的调试代码来查找出错的原因和位置 9 1程序错误与程序调试 9 1 2程序调试为了帮助编程人员在程序开发过程中检查程序的语法 逻辑等是否正确 并且根据情况进行相应修改 VisualStudio NET2008提供了一个功能强大的调试器 在调试模式下 编程人员可以仔细观察程序运行的具体情况 从而对错误进行分析和修正 1 VS NET的工作模式VS NET提供了三种工作模式 设计模式 运行模式和调试模式 1 设计模式 新建或打开应用程序后 自动进入设计模式 此时可以进行应用程序的界面设计和代码编写等操作 9 1程序错误与程序调试 9 1 2程序调试1 VS NET的工作模式 2 运行模式 应用程序设计完之后 按键 或者选择 调试 菜单下的 启动调试 命令 或者单击 调试 工具栏的 启动调试 按钮 系统就进入了运行模式 此时 在标题栏上显示 正在运行 字样 处于运行模式时 编程人员可以与程序交互 可以查阅程序代码 但不能修改程序代码 选择下拉菜单 调试 停止调试 命令 或单击工具栏上的 停止调试 按钮就可以终止程序运行 9 1程序错误与程序调试 9 1 2程序调试1 VS NET的工作模式 3 调试模式 如果系统运行时出现错误 将自动进入调试模式 当系统处于运行模式时 单击工具栏中的 全部中断 按钮 或选择 调试 菜单下的 全部中断 命令 都将暂停程序的运行 进入调试模式 此时 标题栏中显示有 正在调试 字样 程序进入调试模式后 可以检查程序代码 也可以修改代码 检查或修改结束后 单击 继续 按钮 将从中断处继续执行程序 9 1程序错误与程序调试 9 1 2程序调试2 VS NET环境调试设置VisualStudio NET环境调试设置 是通过 选项 对话框 从 工具 菜单选择 选项 命令 进行 此处的调试设置影响所有项目 包括常规 本机 编辑并继续 符号和实时五个方面的调试设置 如图9 3所示 9 1程序错误与程序调试 9 1 2程序调试3 调试工具调试工具可以协助编程人员查看代码执行过程的变量值 属性值 表达式的变化以及代码流程是否正确的执行 直接按下功能键 或单击工具栏的 启动调试 按钮 或选择菜单 调试 下的 启动调试 命令 即可编译并运行程序 VisualStudio NET会将当前项目编译为中间语言 ILCode 为 exe或 dll文件 并将结果放在项目路径下的bin Debug目录下 然后运行 exe文件 程序编译出错或成功运行时 都可以对程序进行调试 在调试应用程序时 可以使用 调试 菜单或 调试 工具栏以及相关调试窗口 9 1程序错误与程序调试 9 1 2程序调试3 调试工具 1 调试 工具栏 要打开 调试 工具栏 可以选择菜单 视图 工具栏 调试 打开如图9 4所示调试工具栏 9 1程序错误与程序调试 9 1 2程序调试3 调试工具 2 调试 窗口 逐行查看代码 可能看不出问题 为了更好地观察运行时的变量和对象的值 VS NET调试器还提供了 监视 窗口 局部变量 窗口 自动窗口 等 调试 窗口 一般在运行或调试模式下利用菜单 调试 窗口 的相应命令打开 以辅助编程人员在程序执行过程中更快地发现错误 图9 5显示的是用逐语句方式单步执行程序代码的过程 其中代码编辑区中的高亮显示部分代表当前正要执行的代码行 局部变量 窗口显示的是局部变量的名称 值和类型 9 1程序错误与程序调试 9 1程序错误与程序调试 9 1 2程序调试4 跟踪程序的执行在VS NET中 提供了 逐语句 逐过程 跳出 等几种跟踪程序执行的方式 逐语句 按键 和逐过程 按键 是VS NET调试器提供了两种单步调试的方法 是使用较频繁的调试方法 即每执行一行代码 程序就暂停执行 直到再次执行 这样就可以在每行代码的暂停期间 通过查看各变量值 对象状态等来判断该行代码是否出错 9 1程序错误与程序调试 9 1 2程序调试4 跟踪程序的执行逐语句和逐过程都是逐行执行代码 所不同的是 当遇到函数时 逐语句方式是进入函数体内继续逐行执行 而逐过程方式只跟踪调用函数的代码 不会进入函数体内跟踪函数本身的代码 当使用逐语句方式进入函数体时 如果想立即回到调用函数的代码处 则需要使用调试工具栏中的 跳出 按钮 跳出 命令是连续执行当前函数的剩余语句部分 并在调用该函数的下一个语句行处中断执行 9 1程序错误与程序调试 9 1 2程序调试5 设置断点在调试程序时 若想让代码运行到某一处能停下来 可以将该处设置为断点 代码运行到断点处就会停止运行 同一程序 可以设置多个断点 其常用的设置方法有三种 1 单击代码编辑器左边的灰色部分 便可在当前行设置一个断点 断点以红色圆点表示 并且该行代码也高亮显示 再次单击该断点 则删除断点 2 把光标指向要设置断点的代码行 单击鼠标右键 选择 断点 插入断点 命令 3 把光标置于要设置断点的行 按键便可在当前行设置一个断点 再次按键可删除该断点 9 1程序错误与程序调试 9 1 2程序调试6 人工寻找逻辑错误在众多的程序错误中 有些错误是很难发现的 尤其是一些逻辑错误 即使是功能强大的调试器也显得无能为力 这时可以适当地加入一些操作 以便快速地找到错误 常用的方法有两种 1 注释掉可能出错的代码 这是一种比较有效的寻找错误的策略 如果注释掉部分代码后 程序能正常运行 那么错误在该部分代码中 否则错误应该在别处 2 适当地添加一些输出语句或类似于消息对话框的控件 通过输出来查看中间结果 以获取更多的辅助信息 9 2异常处理 程序在运行过程中可能会遇到各种各样的异常情况 为此C 提供了结构化的异常处理机制 对这些情况进行处理 从而使程序能够有效地运行 C 使用异常类Exception为每种异常提供定制的处理 并把识别异常的代码和处理异常的代码分离开来 9 2异常处理 9 2 1异常处理简介异常又称例外 是指程序运行过程出现的非正常事件 是程序错误的一种 为保证程序安全运行 程序中需要对可能出现的异常进行相应的处理 NET提供了一种结构化异常处理技术来处理异常错误情况 其基本思路是 当出现异常时 创建一个异常对象 然后根据程序流程 将异常对象传递给一段特定的代码 用 NET术语来讲 则是由一段代码抛出异常对象 由另一个代码段捕获并处理 异常处理主要包括三方面的内容 1 定义异常 分为系统定义和用户定义 2 引发异常 分为自动引发和显式引发 3 处理异常 分为系统处理和用户自定义处理 9 2异常处理 9 2 1异常处理简介异常处理的一般过程为 引发异常后 先根据定义判断是哪种类型的异常 然后执行这种类型的异常处理程序段 实际上 异常是一个类实例 即C 语言中的异常都是异常类的对象 NET框架类库中预定义了大量的异常类 每个异常类代表了一种异常错误 每当C 程序出现运行时错误 系统就会创建一个相应的异常类对象 即异常 并引发 而所有的异常都派生自System Exception类 因此理解Exception类是处理异常的关键 9 2异常处理 9 2 2异常类Exception类是其他所有异常的基类 位于System命名空间中 Exception类是SystemException和ApplicationException两个泛型子类的基类 所有的异常对象都直接继承自这两个子类 SystemException表示系统引发的异常 ApplicationException表示编程人员在程序中所引发的异常 9 2异常处理 9 2 2异常类1 Exception类的常用属性和构造函数Exception类的属性成员描述了该类对应异常的详细信息 通过它们可以获取异常对象的基本信息 Exception类常用的属性成员有 Message string类型 获取描述当前异常的消息 Source string类型 获取或设置导致错误的应用程序或对象的名称 TargetSite System Reflection MethodBase类型 获取引发当前异常的方法 HelpLink string类型 获取或设置指向此异常所关联帮助文件的链接 InnerException Exception类型 获取导致当前异常的Exception实例 9 2异常处理 9 2 2异常类1 Exception类的常用属性和构造函数C 语言中 异常类中都定义有多个构造函数 Exception类中常用的构造函数有 publicException 默认构造函数publicException stringmessage publicException stringmessage System ExceptioninnerException 2 常用的系统异常类SystemException是所有框架类库中预定义的异常类的基类 表9 2列出了框架类库中定义的几个常用异常类 9 2异常处理 9 2 2异常类3 自定义异常类C 语言中 编程人员除了使用框架类库中定义的异常类外 还可能需要定义自己的异常类 以便指出自己编写的程序中可能存在的特定异常 自定义异常类时 应该使之派生于ApplicationException类 例如 classMyException System ApplicationException publicMyException publicMyException stringmsg base msg publicMyException stringmsg Exceptione base msg e 9 2异常处理 9 2 2异常类3 自定义异常类实现定制异常类时应遵循的相关规则 1 应从ApplicationException类派生 2 按照约定 自定义异常类名应以Exception结尾 3 自定义异常类应包含Exception基类定义的三个公共构造函数 默认的无参构造函数 带一个string型参数 通常是异常信息 的构造函数 带一个string型参数和一个Exception型参数的构造函数 4 使用基类初始化调用 调用基类构造函数来负责具体的对象创建 如果要增加字段或属性成员 则要增加新的构造函数来初始化这些值 9 2异常处理 9 2 3引发异常框架类库定义的标准系统异常 一般由系统自动引发 通知运行环境异常的发生 不过 其他异常 如用户自定义异常 则必须在程序中利用关键字throw显式引发 当然 框架类库中预定义的标准系统异常也可以利用关键字throw在程序中引发 throw语句用于手动地抛出一个异常 也就是编程人员 而不是系统 告诉运行环境什么时候发生异常及发生什么样的异常 throw语句的语法格式如下 throw 异常对象 9 2异常处理 9 2 3引发异常例如 staticintmethod inta intb if a 0 thrownewMyException 被除数不能小于零 if b 0 thrownewDivideByZeroException 除数不能等于零 intc a b returnc 9 2异常处理 9 2 4异常的捕捉及处理异常引发后 如果程序中没有定义相应的处理代码 系统将按例9 1所示默认方式进行处理 这样会导致程序强制中断 并由系统报错 实际编程时 为了确保异常能够被正确地捕捉并处理 通常需要在程序中加入相应的异常处理程序代码 C 提供了三种形式的异常处理结构 1 try catch结构C 语言中 异常处理需要使用try catch结构 语法格式如下 9 2异常处理 try 可能引发异常的程序代码 catch 类型1变量1 对类型1异常进行处理的异常处理程序代码 catch 类型2变量2 对类型2异常进行处理的异常处理程序代码 catch 类型n变量n 对类型n异常进行处理的异常处理程序代码 9 2 4异常的捕捉及处理1 try catch结构 9 2异常处理 9 2 4异常的捕捉及处理1 try catch结构 说明 将可能引发异常的程序代码放在try块中 处理异常的异常处理程序代码放在catch块中 每一个catch块类似于一个方法 catch关键字后有一对圆括号 圆括号中是异常类型和异常对象名 其中异常类型通常被称作 异常筛选器 如果某个catch块中的异常处理程序中没有使用该参数变量 可以只指定异常类型 没有必要同时给出参数变量 甚至异常类型和变量都省略 9 2异常处理 9 2 4异常的捕捉及处理1 try catch结构C 程序运行时 如果引发了异常 就抛出了一个异常对象 此时程序将中断正常运行 系统会检查引发异常的语句以确定它是否在try块中 如果是 则按照catch块出现的先后顺序进行扫描 根据catch块中的异常参数类型找出最先与之匹配的catch块 catch块与引发的异常匹配 是指catch块中的异常参数类型与异常或其基类的类型相同 如果按顺序找到了一个与try块中引发的异常相匹配的catch块 则开始执行该catch块中的异常处理程序 之后不再执行其它catch块 而是从catch块后的第1个语句处恢复执行 抛出的异常与某一catch块匹配 通常被称作异常被该catch块捕捉 9 2异常处理 9 2 4异常的捕捉及处理1 try catch结构由于在寻找与异常匹配的catch块时 是按照catch块代码的先后顺序来扫描处理的 所以 以异常子类作为异常参数的catch块必须位于以异常基类作为异常参数的catch块的前面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 茶山农庄招租转让合同
- 加装电梯与造桥合同
- 法天使买卖合同
- 广东结婚首饰租赁合同
- 城乡牵手共建协议书
- 品牌代理股权协议书
- 咨询类公司合同范本
- 委托试验检测协议书
- 垃圾代收协议书范本
- 塔机合伙合同协议书
- 电子专用设备装调工复试强化考核试卷含答案
- 2025至2030中国晶体行业项目调研及市场前景预测评估报告
- 2025年药品检验员模拟试题(附答案解析)
- 五色糯米饭做法课件
- GB 46768-2025有限空间作业安全技术规范
- 汽车科职业生涯规划
- 2026年高考语文必背120个文言实词(教材例句+成语助记+练习+高考链接)学生版+解析版
- 2025 年高职机电一体化技术(机械制图)期中测试卷
- 136号文深度解读及案例解析培训课件
- 江苏南京市产业招商中心有限责任公司招聘笔试题库2025
- 2025年松原市总工会公开招聘工会社会工作者(10人)考试笔试模拟试题及答案解析
评论
0/150
提交评论