第7章异常处理与程序调试技术(精)
- 格式:doc
- 大小:31.50 KB
- 文档页数:5
《Python程序设计》习题与参考答案第1章基础知识 简单说明如何选择正确的 ⍓♦♒☐⏹版本。
答:在选择 ⍓♦♒☐⏹的时候,一定要先考虑清楚自己学习 ⍓♦♒☐⏹的目的是什么,打算做哪方面的开发,有哪些扩展库可用,这些扩展库最高支持哪个版本的 ⍓♦♒☐⏹,是 ⍓♦♒☐⏹ ⌧还是 ⍓♦♒☐⏹ ⌧,最高支持到 ⍓♦♒☐⏹ 还是 ⍓♦♒☐⏹ 。
这些问题都确定以后,再做出自己的选择,这样才能事半功倍,而不至于把大量时间浪费在 ⍓♦♒☐⏹的反复安装和卸载上。
同时还应该注意,当更新的 ⍓♦♒☐⏹版本推出之后,不要急于更新,而是应该等确定自己所必须使用的扩展库也推出了较新版本之后再进行更新。
尽管如此, ⍓♦♒☐⏹ 毕竟是大势所趋,如果您暂时还没想到要做什么行业领域的应用开发,或者仅仅是为了尝试一种新的、好玩的语言,那么请毫不犹豫地选择 ⍓♦♒☐⏹ ⌧系列的最高版本(目前是 ⍓♦♒☐⏹ )。
为什么说 ⍓♦♒☐⏹采用的是基于值的内存管理模式?答:⍓♦♒☐⏹采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值,多个变量指向同一块内存地址,例如下面的代码。
⌧ ♓♎☎⌧✆ ⍓ ♓♎☎⍓✆ ⍓ ♓♎☎⍓✆ ♓♎☎⌧✆ 在 ⍓♦♒☐⏹中导入模块中的对象有哪几种方式?答:常用的有三种方式,分别为●♓❍☐☐❒♦ 模块名 ☯♋♦ 别名●♐❒☐❍ 模块名 ♓❍☐☐❒♦ 对象名☯ ♋♦ 别名●♐❒☐❍ ❍♋♦♒ ♓❍☐☐❒♦ ✉ 使用☐♓☐命令安装⏹◆❍☐⍓、♦♍♓☐⍓模块。
答:在命令提示符环境下执行下面的命令:☐♓☐ ♓⏹♦♦♋●● ⏹◆❍☐⍓☐♓☐ ♓⏹♦♦♋●● ♦♍♓☐⍓ 编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。
酒店管理管理系统java课程设计一、课程目标知识目标:1. 学生能够理解酒店管理系统的业务流程和功能需求。
2. 学生能够掌握Java语言面向对象编程的基本概念,包括类、对象、继承、封装和多态。
3. 学生能够运用Java集合框架处理酒店管理系统中数据存储与检索。
4. 学生理解并掌握Java异常处理机制,提高程序的稳定性和可靠性。
5. 学生能够运用Java事件处理机制实现用户界面与酒店管理系统的交互。
技能目标:1. 学生能够独立设计并编写酒店管理系统的功能模块。
2. 学生能够运用集成开发环境(IDE)进行代码编写、调试和优化。
3. 学生能够通过编写代码实现酒店管理系统的模块测试和系统集成。
4. 学生能够运用软件工程方法,编写技术文档,对系统设计进行说明。
情感态度价值观目标:1. 学生通过课程学习,培养对酒店管理行业信息化的认识和兴趣。
2. 学生在团队协作中,学会沟通与交流,提高解决实际问题的能力。
3. 学生在学习过程中,养成积极思考、主动探索的良好习惯,增强自主学习能力。
4. 学生能够认识到编程在酒店管理系统开发中的实际应用,提高职业素养和社会责任感。
二、教学内容1. 酒店管理系统的业务需求分析,涉及客户管理、房间管理、预订管理、入住退房管理等模块。
2. Java面向对象编程基础,包括类与对象、构造方法、访问控制、继承与多态。
- 教材章节:第三章《Java面向对象编程》。
3. Java集合框架的使用,如List、Set、Map等数据结构在酒店管理系统中的应用。
- 教材章节:第五章《Java集合框架》。
4. Java异常处理机制,捕获和处理程序运行时的异常。
- 教材章节:第七章《Java异常处理》。
5. Java事件处理和图形用户界面设计,实现酒店管理系统的交互界面。
- 教材章节:第十章《Java图形用户界面编程》。
6. 数据库连接和SQL语句,实现酒店管理系统中数据的存储和查询。
- 教材章节:第八章《数据库编程》。
第7章异常处理与程序调试技术
第1节异常处理概述
一、异常的概念
所谓异常是指程序在运行时遇到的一些无法预知,需要特别处理的状况。
例如程序要打开一个不存在的文件、网络连接中断、操作数越界、装载一个不存在的类等问题。
二、Delphi的异常处理机制
Delphi提供了一套默认的自动异常处理机制,即当程序发生错误后会自动退出当前运行的程序模块,并以对话框的形式给出相应的错误信息,但是并不会引起应用程序的非法终止。
Delphi的异常处理机制是建立在保护块的概念上的。
保护块是用保留字try和end封装起来的一段代码。
当应用程序发生错误时,系统会自动创建相应的异常类的对象,该异常对象通常包含了错误的相关信息。
程序可以捕获并处理这个异常对象,如果程序中没有定义对该异常的处理,则系统会自动产生一个消息框来描述这个错误,并保证程序不会非法终止。
三、异常类
在Delphi中,所有的异常类都派生自Exception类,该类是在SysUtils单元中定义的,如果一个程序的Uses语句中包含了SysUtils单元,则运行中发生错误时就会引发一个异常。
需要注意的是,异常不同于错误,编程者可以引发一个自定义异常。
例如:
Raise Exception.Create('My Error');
第2节异常处理的语法
Delphi提供了两种处理异常的基本结构:try…except和try…finally。
前者主要用于编写异常处理代码,后者主要用于保护系统资源。
一、try…except…end
try…except…end形成一个异常响应保护块。
正常情况下except后面的语句并不会被执行,而当一条或多条try块中的语句执行失败时,则发生异常,程序自动跳到except块中,进入异常响应处理模块中去执行。
当异常被响应后异常类自动清除。
二、try…except on…do… end
这种异常响应保护块通过使用on…do来响应不同类型的异常,其中on之后为异常的类型。
例如:
var
I,J,K: Integer;
begin
Try
I:=StrToInt(Edit1.Text);
J:=StrToInt(Edit2.Text);
K:=I div J;
Edit3.Text:=IntToStr(K);
Except
On EDivByZero do
ShowMessage(‘除数为0!');
On EConvertError do
ShowMessage('数据类型错误!');
end;
end;
说明:
①如果未编写异常处理结构,当发生异常时,VCL将调用默认的异常处理程序,通常会显示一个消息框,显示与对应的异常有关的错误信息。
②即使为可能出现的异常编写了t ry…except结构,在Delphi开发环境中运行调试程序时,系统仍然会在出现异常的代码处中断程序运行(此时可执行菜单命令【Run | Program Reset】返回设计状态)。
对于这样的程序,可先编译、保存,然后直接执行编译后的可执行文件。
③父类异常可以对子类异常做出响应。
例如,Exception类可以响应所有异常。
如果在except块中含有多行on...do子句,应注意它们的继承层次关系。
若各子句中的异常类之间存在直系继承关系,应将后代子句置前,祖先子句置后。
否则,处于低层次的异常子类处理子句将不被执行。
三、try…finally…end
显示错误消息是异常处理的一个方面,当错误发生时,还应该保证系统的稳定,如及时释放已经分配的资源,避免系统的崩溃等,可以采用try…finally…end结构实现。
Finally 之后的语句无论如何都会被执行,因此可以用于资源保护。
例如,以下程序段存在缺陷:
var
P:Pointer;
I,J:integer;
Begin
I:=0;
GetMem(P,2048); //为指针P分配2K内存
J:=5 div I;
FreeMem(P,2048); //释放为指针P分配的内存
End;
当运行到语句“J:=5 div I;”时,因I=0会产生被0除的异常。
此时程序会从异常发生点退出当前程序块,FreeMem语句没有执行的机会,从而导致为指针P分配的内存未被释放。
采用try…finally…end结构可解决此问题:
var
P:Pointer;
I,J:integer;
Begin
I:=0;
GetMem(P,2048);
Try
J:=5 div I;
Finally
FreeMem(P,2048);
End;
End;
与t ry…except结构不同,无论是否发生异常,finally块中的语句均会执行,从而保护系统资源。
四、资源保护与异常处理的结合
t ry…finally结构用于保护资源,但不对异常进行任何处理。
可以将t ry…except和t ry…finally结构相结合,构成嵌套的try结构,既处理异常,又保护资源。
一般格式如下:... //分配资源
try
try
... // 可能引发异常的语句
except
...//异常处理语句
end;
finally
{释放资源};
end;
例如:
var
x, y: Integer;
A: array of Extended; //声明动态数组
begin
x := 1;
y := 0;
SetLength(A,1); //为动态数组分配内存
try
try
A[0] := x / y; //此句将引发异常
except
ShowMessage('除数不得为0!'); //处理异常
end;
finally
A := nil; //释放资源
end;
end;
五、自定义异常
自定义异常同定义新的类相似,只是Delphi中异常的基类是Exception类,因此,自定义异常的语法通常如下:
type
异常类名=class(Exception)
要引发该异常,可以使用如下方法:
Raise 异常类对象名(参数);
第3节程序调试
一、程序中的错误
程序中的错误可以分成三类:语法错误、运行时错误和逻辑错误。
语法错误:语句不符合语法规范。
如:begin和end不匹配、句末漏掉分号、标识符未声明、数据类型不符等。
运行时错误:程序通过编译,但执行时发生错误。
如:试图打开一个不存在的文件、被0除等。
程序执行到该语句时,Delphi的集成调试环境会自动停止程序执行,并显示错误信息对话框。
单击对话框中的OK按钮后,系统便回到源程序中出错的地方。
逻辑错误:程序可以通过编译并运行,但结果和期望不同。
二、程序运行方式
RUN:单击Run|Run菜单项或工具栏上的运行按钮或快捷键F9。
这时,系统会自动编译该程序。
如果程序中没有语法错误,则执行该程序。
Compile:选择Project|Compile菜单项或按Ctrl+F9,编译程序会编译包括.dpr在内的全部改动过的文件,并生成.exe文件,但不会运行程序。
如果程序中有语法错误,编译程序就能找出来。
Build:选择Project|Build菜单项,编译程序会编译项目中的所有文件,无论它们是否被改动。
Project|Compile All Projects和Project|Build All Projects:在使用项目组时使用,编译项目组中的所有项目。
三、断点的使用
断点必须设置在可执行语句上,程序运行到断点时会自动停下,回到调试监控模式,此时断点处的语句尚未执行。
可以用单步执行的方式观测各变量的值,从而检查程序的出错点的位置。
设置方法:单击需设置断点的行左侧的灰色区域。
再次单击则取消断点。
四、运行到光标处
将光标移到目标位置,按F4键。
五、单步调试
常用的单步调试方法如下:
Trace Into(按F7键):当程序运行到调用自定义函数、过程时,Trace Into方式会进入到子程序内部跟踪,并停留在子程序的第一行代码处。
当程序执行到子程序的结束处时,就返回主程序中。
但是,这种方法不会进入Delphi提供的库函数内部进行跟踪。
Step Over(按F8键):每次只执行一行程序,当遇到自定义函数或过程的调用时,不会进入函数进行进一步的跟踪,而是直接把函数执行完毕,再停在程序的下一行。
如果能够确信自定义函数无错时,使用Step Over方法比Trace Into方法更能简化调试工作。
六、观察窗(WatchList)
观察窗是监控程序执行的工具之一,利用它和前面的各种执行方式相配合,可以检测各个变量及表达式在程序执行的某个阶段的值。
练习
1. 练习处理异常
参考教材【例7-2】,练习处理异常。
2. 练习使用断点和观察窗
按照习题7.4的要求,练习使用断点和观察窗调试程序。