c程序设计教程刘瑞新第8章异常处理、程序调试和文件操作新
- 格式:ppt
- 大小:3.53 MB
- 文档页数:43


第五章 程序调试和异常处理
【学习目标】
1. 了解应用程序常见的错误类型
2. 掌握应用程序的调试方法
3. 掌握结构化异常处理的方法
【重点难点】
1. 应用程序的调试方法
2. 结构化异常处理的方法
【教学时数】4学时(2学时理论+2学时实践)
随着程序规模的越来越庞大和结构的越来越复杂,在程序编写中不可避免地会产生一些错误,这些错误称为缺陷。找出并排除这些错误的过程称为调试。本节中将介绍错误的类型,常用的调试工具和在应用研究程序中实现结构化的异常处理。
5.1错误类型
程序中的错误通常可以分成3类:语法错误、运行错误和逻辑错误。可以使用不同的方法和工具来查找并修改每种类型的错误。其中语法错误比较容易排除,也是一种低级的错误。运行错误和逻辑错误需要靠经验、调试工具以及不断深入地分析代码来排除。
1. 语法错误
语法错误通常发生在编程人员对语言本身的熟悉度不足,例如关键字拼错、标点错误(如西文标点写成了中文标点)或漏写、结构错误(如If之后忘了加上Then或者For语句少了Next)等等。
在应用程序代码中每输入一句语句,VB .NET都会显示其所包含的语法错误(若存在语法错误的话),包含错误的那部分代码下会标有波浪线。当把鼠标指针移到带波浪的代码上时,鼠标指针附近就会出现一条简短的错误描述提示,并且,运行后在任务列表窗体中会产生相关的错误信息。见图 5-1。
(a) (b)
图5-1 语法错误
2. 运行错误
运行是错误多数发生于不可预期的异常。比如打开硬盘上的某个文件时,该文件不存在:向硬盘上写某个文件的时候,硬盘的空间不足;由于网络阻塞得不到预期的数据等。也有可能是用户不按正确的操作步骤而造成的错误,比如在做除法的时候除数为零;访问数组的时候,超出了可访问下标的范围。
3. 逻辑错误
第八章 程序调试
程序错误分类
VB中常见的程序错误可分为编译错误、运行错误和逻辑错误3类。
1.编译错误
编译错误也称为语法错误,在编写程序时,如果语句不符合Visual Basic的语法规则,就会产生这类错误。例如,输入了不正确的关键字、遗漏了某个必需的标点符号、缺少表达式、类型不匹配或者应该配对的语句没有配对等,都会产生编译错误。
在编写代码或运行程序时,很容易检查出这类错误。在编写代码时,VB会自动对程序进行语法检查,某些类型的语法错误能够被即时检查出来,并且会弹出一个出错消息框,出错的那一行以高亮度显示。例如,当输入“I=”后没有接着输入表达式,而是切换到其他行,则会弹出如图8.1所示的消息框。
还有一些类型的语法错误,在编写代码时VB检查不出来,例如,If语句后没有对应的End If语句、输入了错误的属性名等。在运行程序时,VB将弹出错误消息框,提示用户错误所在,如图8.2所示。
2.运行错误
运行错误是程序运行时出现的错误。运行时,如果一个语句无法正常完成自己的功能时,就会出现这类错误。例如,执行除法操作时除数为0,或加载一个图片时文件不存在,都将产生错误。出现运行错误时也会弹出一个消息框,如图8.3所示的是除数为0时弹出的消息框。
运行错误消息框的第一行显示的是运行错误代号,每个运行错误都对应一个代号。第二行显示的是错误的说明。
单击【结束】按钮,则结束程序的运行,返回到设计模式;单击【调试】按钮,则切换到中断模式,显示出【代码】窗口,并且出错的语句以高亮度显示,此时可以编辑代码。单击【帮助】按钮,则打开VB的帮助窗口。其中提供了错误说明、错误代号、引发错误的原因以及解决错误的办法等信息。
3.逻辑错误
有的时候,应用程序的代码完全符合语法要求,运行时也不出现任何错误,但却未出现期望的结果,这表明程序中存在逻辑错误。这类错误是因为代码中存在逻辑上的缺陷而引起的,例如,设置的选择条件不合适、循环次数不当等。逻辑错误最隐蔽,较难发现和排除,程序员的语言功底和编程经验在排除这类错误时很重要。
C语言中的异常处理与错误调试方法
在C语言编程中,异常处理和错误调试是至关重要的技术,它们可以帮助程序员更高效地调试程序和优化代码。异常处理是在程序执行过程中出现意外情况时的处理方法,而错误调试则是通过定位和修复程序中的bug来提高程序的质量。
首先,异常处理是指程序在执行过程中可能出现的异常情况,比如除零错误、数组越界、空指针等。为了避免程序崩溃,我们可以使用try-catch语句来捕捉异常并进行处理。在C语言中,我们可以使用setjmp和longjmp函数实现类似于try-catch的异常处理机制。setjmp函数用于设置一个跳转点,当程序出现异常时,可以通过longjmp函数跳转到预先设置的跳转点,并进行相应处理。
另外,C语言中还可以使用signal函数处理信号,比如SIGSEGV信号表示内存访问错误,可以使用信号处理函数对其进行处理。同时,我们还可以自定义异常处理函数来处理特定的异常情况,增强程序的健壮性和稳定性。
在进行错误调试时,我们可以通过打印调试信息、使用断点调试、利用调试器等方法来定位和修复程序中的bug。打印调试信息是最简单的方法,通过在程序中插入printf语句输出变量的值,可以帮助我们了解程序的执行流程和变量的取值情况。此外,通过使用断点调试工具,比如GDB,可以在程序执行过程中暂停程序,并逐步调试程序,查看变量的值和程序的执行流程,从而更快地定位bug。调试器还可以支持查看内存信息、查看堆栈、查看寄存器状态等功能,帮助我们全面分析程序的运行情况。
除此之外,我们还可以使用静态分析工具和动态分析工具来辅助调试程序。静态分析工具可以帮助我们在代码编译前检测潜在的bug和漏洞,提高代码质量。而动态分析工具可以监控程序的运行情况,帮助我们快速地定位bug并修复问题。动态分析工具还可以帮助我们查找内存泄露、检测线程问题等,提高程序的稳定性和性能。 总结来说,异常处理和错误调试是C语言编程中必不可少的重要技术,可以帮助我们提高程序的健壮性和稳定性。通过有效地处理异常和及时地调试bug,我们可以编写出高质量的C语言程序,满足不同场景的需求。希望以上内容能帮助您更好地理解C语言中的异常处理与错误调试方法。
CSAPP第⼋章
CSAPP第⼋章
参考
8.1异常
异常是异常控制流的⼀种形式,⼀部分由硬件实现,⼀部分由操作系统实现
a transfer of control to the OS kernel in response
to some event
异常(exception)控制流的突变,⽤来响应处理器状态的某些变化。
事件(event)状态变化
事件可能与当前执⾏指令有关
存储器缺页,算数溢出
除0
也可能与当前执⾏指令⽆关
I/O请求定时器产⽣信号
通过异常表(exception table)的跳转表,进⾏间接过程调⽤(异常),到专门设计处理这种事件的操作系统⼦程
序(异常处理程序(exception handler)
异常处理程序在执⾏结束后,会发⽣以下三种情况之⼀:
1. 返回应⽤程序当前指令Icurr
2. 返回应⽤程序的下⼀条指令Inext
3. 异常处理程序终⽌被中断的应⽤程序
8.1.1 异常处理
系统启动时,操作系统分配和初始化⼀张称为异常表的跳转表。
条⽬k包含异常k的处理程序的地址。
异常表的起始地址放在叫异常表基址寄存器的特殊CPU寄存器中。
异常类似过程调⽤,不过有以下不同
过程调⽤,跳转到处理程序前,处理器将返回地址压⼊栈中。对于异常,返回地址是当前,或下⼀跳指
令。
处理器会把额外的处理器状态压⼊栈中。
如果控制⼀个⽤户程序到内核,那么所有这些项⽬会被压⼊内核栈中,⽽是⽤户栈。
异常处理程序运⾏在内核模式下,这意味他们对所有系统资源有完整访问权限。
8.1.2 异常的类别
同步 synchronous 当⼀个⽅法被调⽤时,调⽤者需等待该⽅法执⾏完毕返回才能继续执⾏
异步 asynchronous 当⼀个⽅法被调⽤时,⽴即返回,并获取⼀个线程执⾏该⽅法内部的业务,调⽤者不⽤等待该⽅法执⾏完毕
1.中断
中断异步发⽣,来⾃处理器外部的I/O设备的信号的结果
硬件中断不是由任何⼀条专门的指令造成,从⼀定意义上时异步的