异常处理与调试2

让编程改变世界

Change the world by program


Delphi 异常类

利用异常机制,就是允许写代码时可以假设:如果用户可以得到子程序调用或计算的结果,这些结果一定是有效的。

如果你在写程序的时候发现自己在为几乎每个单独的语句编写异常处理程序,那么说明还没有掌握要点。

如果你在阅读经典代码时经常考虑“如果执行到这里,那么在此之前的每件事情都一定已经运行得很好了!”那么就说明已经掌握了正确的概念。

异常类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。

Delphi提供的所有异常类都是Exception类的子类。用户也可以从Exception类派生一个自定义的异常类。

Delphi 提供了一个很庞大的异常类体系,这些异常类几乎涉及到编程的各个方面。

从大的方面可以把异常类分为运行库异常、对象异常、组件异常 3 类。下面介绍它们中常用的异常类!

异常的基本语法结构

Delphi异常处理机制建立在保护块(Protected Blocks)的概念上。

所谓保护块是用保留字try和end封装的一段代码称为保护块,保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。

程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。

当然如果程序不进行处理,则系统会自动提供一个消息框。

异常响应与 try…except 语句

try…except语句的一般格式如下:

[codesyntax lang="delphi"]

try 				//try 保护代码块
被保护语句
except //异常处理块
异常处理语句 //异常不发生,不处理
end;

[/codesyntax]

Except关键字后面经常还可以加一系列“on…do”语句:

[codesyntax lang="delphi"]

try                     			//try 保护代码块
被保护语句
except //异常处理块
on <异常对象类型 1> do <语句 1> //捕获指定类型的异常对象,进行处理
on <异常对象类型 n> do <语句 n> //捕获指定类型的异常对象,进行处理
else
<语句 n+1> //默认的异常处理代码
end;

[/codesyntax]

[codesyntax lang="delphi"]

try
b:= StrToFloat(edit1.Text);
c:= StrToFloat(edit2.Text);
a:= b /c;
Edit3.Text:= FloatToStr(a);
except
on Ezerodivide do Edit3.Text:='不能用 0 除';
on EMathError do Edit3.Text:='计算错误';
else
Edit3.Text:='发生异常';
end;

[/codesyntax]

异常保护与 try…finally 语句

确保回收分配的资源是程序健壮性的一个关键,一般说来需要保护的资源包括:文件、内存、Windows资源和对象。

下面一段程序就会造成1KB的内存资源的丢失:

[codesyntax lang="delphi"]

n:= 0;
GetMem(pPointer, 1024); //分配 1KB 的内存
m:= 10 div n; //这里将触发被零除的异常
FreeMem(pPointer, 1024); //永远执行不到这里

[/codesyntax]

try…finally 语句的一般格式如下:

[codesyntax lang="delphi"]

try 		    	//try 保护代码块
被保护语句
finally //异常处理块
异常处理语句 //无论异常发生否,都必须处理
end;

[/codesyntax]

[codesyntax lang="delphi"]

n:= 0;
GetMem(pPointer, 1024); //分配 1KB 的内存
try
m:= 10 div n; //这里将触发被零除的异常
finally
FreeMem(pPointer, 1024); // 必须被执行
end;

[/codesyntax]

try…finally结构与try…except结构的区别

对于try…finally结构来说,不管try部分的代码是否触发异常,finally部分总是执行的。如果发生异常,就提前跳到finally部分。而对于 try…except结构来说,只有当触发了异常后,才会执行except部分的代码。

在try…except结构中,当异常被处理后异常对象就被释放,除非重新触发异常。而在try…finally结构中,即使finally部分对异常作了处理,异常对象仍然存在。

finally部分不能处理特定的异常,因为它没有try…except结构中的异常句柄,无法知道确切的异常类型。因此,在finally部分只能对异常做笼统的处理。

在try…finally结构中,如果在try部分调用标准命令Exit、Break或Continue,将导致程序的执行流程提前跳到finally部分。finally部分不允许调用上述3个命令。

[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/BdsUAwJp.gDVMehR676']视频下载[/Downlink]

异常处理与调试2 - 零基础入门学习Delphi51的更多相关文章

  1. 异常处理与调试4 - 零基础入门学习Delphi53

    调试(Debug) 让编程改变世界 Change the world by program 调试(Debug) 在应用程序开发中检测.处理程序中的错误是一个非常重要的环节.在Delphi的集成开发环境 ...

  2. 异常处理与调试3 - 零基础入门学习Delphi52

    异常处理与调试3 让编程改变世界 Change the world by program 两种结构的嵌套 要在一个过程里同时实现处理异常和保护资源分配,关键要保证"try-except&qu ...

  3. 异常处理与调试6 - 零基础入门学习Delphi55(完)

    调试(Debug) 让编程改变世界 Change the world by program 使用调试窗口 为方便调式程序,Delphi中提供了许多调试窗口,给开发人员的调试工作带来了极大的便利. 断点 ...

  4. 异常处理与调试5 - 零基础入门学习Delphi54

    调试(Debug) 让编程改变世界 Change the world by program [caption id="attachment_2731" align="al ...

  5. 小甲鱼零基础入门学习python--课后作业

    [小甲鱼零基础入门学习python--课后作业] 小甲鱼零基础入门学习python--课后作业 本章内容: 1.基础部分的作业 2.函数部分的作业 3.字典.集合.文件部分作业 4.异常 5.Easy ...

  6. 函数:我的地盘听我的 - 零基础入门学习Python019

    函数:我的地盘听我的 让编程改变世界 Change the world by program 函数与过程 在小甲鱼另一个实践性超强的编程视频教学<零基础入门学习Delphi>中,我们谈到了 ...

  7. 【Python教程】《零基础入门学习Python》(小甲鱼)

    [Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609

  8. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  9. 零基础入门学习Python(1)--我和Python的第一次亲密接触

    前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...

随机推荐

  1. MHA环境搭建【4】manager相关依赖的解决

    mha的manager 结点依赖与mha-node软件包.所以在安装mha-manager之前要把mha-node安装上去:再者mha-manger还依赖于perl-Config-Tiny perl- ...

  2. Facebook公开其Hadoop与Avatarnode代码——有效解决Namenode顽疾

    Google在2004年创造了MapReduce,MapReduce系统获得成功的原因之一是它为编写需要大规模并行处理的代码提供了简单的编程模式.MapReduce集群可包括数以千计的并行操作的计算机 ...

  3. PHP-FPM小故障解决记录

    前天昨天发生的事. 阿里云升级MYSQL,申请只读库之后,IP发生了改变,PHP中关于数据库的连接都需要修改. 我们是以实例名作为统一连接字符的. 但在其中一台后端机器上,死活不生效. 就是如何是用I ...

  4. 错误:指定的任务可执行文件位置 D:\Android\platform-tools\aapt.exe 无效

    android-apt-compiler: Cannot run program "D:\android-sdk\platform-tools\aapt 装上IntelliJ IDEA /下 ...

  5. UML--建模

    建模公式 这种精华的东西,一定是值得研读和实践的! myself:人,事,物,规则. 人,业务主角.业务工人.参与者.如果应用到教务系统中,就是管理员,主任,老师的关系. 事,业务用例,系统用例. 物 ...

  6. 自定义的string类

    头文件Hi_String.h #include<iostream> #include<string.h> using namespace std; class Hi_Strin ...

  7. CodeForces 158 B. Taxi(模拟)

    [题目链接]click here~~ [题目大意]n组团体去包车,每组团体的人数<=4,一辆车最多容纳4人,求所求车的数目最小 [解题思路]:思路见代码~~ // C #ifndef _GLIB ...

  8. mmc加工配套问题

    题目如下,本题还有其它解.

  9. html5lib-python doc

    http://html5lib.readthedocs.org/en/latest/ By default, the document will be an xml.etree element ins ...

  10. 【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)

    处理一些分组后,该组按照某列排序后 ,取其中某条完整数据的问题. 或 按照其中不同列分组后的聚合 比如 sum,avg之类. MSDN上语法: Ranking Window Functions < ...