异常处理与调试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. Java笔记--File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

    转自:http://hi.baidu.com/danghj/item/0ef2e2c4ab95af7489ad9e39 参考资料:  < core java > 12 章 使用 Java ...

  2. 转载收藏之用 - 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK

    Senparc.Weixin.MP SDK已经涵盖了微信5.0的所有公共API,以及2013年10月29日升级之后大部分实用的接口. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:ht ...

  3. ListView 实现分组

    1:FragmentHack4.java /** * Created by y on 15-1-2. */ public class FragmentHack4 extends Fragment{ V ...

  4. java 将GBK编码文件转为UTF-8编码

    需要commons-io-2.0.1.jar public class Test { public static void main(String args[]) throws IOException ...

  5. BZOJ 1497 最大获利(最大权闭合子图)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路:由题意可以得知,每个顾客都依赖2个中转站,那么让中转站连有向边到汇点,流量为它的建设费用 ...

  6. perl 对象 通过bless实现

    对象只是一种特殊的引用,它知道自己是和哪个类关联在一起的,而构造器知道如何创建那种关联关系. 这些构造器是通过使用bless操作符,将一个普通的引用物转换成一个对象实现的,

  7. Palindrome Linked List 解答

    Question Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O ...

  8. POJ3669(Meteor Shower)(bfs求最短路)

    Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12642   Accepted: 3414 De ...

  9. phpWeb

    Ruby on Rails框架在REST走得很前,开发时默认都按照RESTful风格搭建. <RESTful Web Services>是本好书 SOAP

  10. awk笔记1

    grep: 文本过滤器    grep 'pattern' input_file ... sed:流编辑器 awk: 报告生成器    格式化以后,显示 AWK a.k.a. Aho, Kernigh ...