异常处理与调试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. Linux免SSH密码登录

    SSH免密码登录,做个总结吧! 1.安装SSH服务(略过) 2.场景:需要配置主机A无密码登录主机B 在主机A上执行如下: cd ~/.ssh ssh-keygen -t rsa 生成密钥文件 cp ...

  2. [转]学DSP、FPGA、ARM,哪个更有前途?

    1.这世界真是疯了,貌似有人连FPGA原理是什么都不知道就开始来学习FPGA了. 2.DSP就是一个指令比较独特的处理器.它虽然是通用处理器,但是实际上不怎么“通用”.技术很牛的人可以用DSP做一台电 ...

  3. PooledDataSource--mybatis-3-mybatis-3.2.3

    org.apache.ibatis.executor.SimpleExecutor public <E> List<E> doQuery(MappedStatement ms, ...

  4. 解决SQL server不支持utf8,php却用utf8的矛盾问题

    function convert2utf8($string) { return iconv("gbk","utf-8",$string); } function ...

  5. poj 1149 pigs(最大流)

    题目大意:迈克在农场工作,农场有 m 个猪舍,每个猪舍有若干只猪,但是迈克不能打开任何一间猪舍.有 n 个顾客前来购买,每个顾客有最大的购买数量,每个顾客可以购买某些猪舍的猪,且顾客可以打开这些猪舍, ...

  6. nodejs学习笔记之安装、入门

    由于项目需要,最近开始学习nodejs.在学习过程中,记录一些必要的操作和应该注意的点.       首先是如何安装nodejs环境?(我用的是windows 7环境,所以主要是windows 7的例 ...

  7. setOpaque(true);设置控件不透明

    setOpaque(true);设置控件不透明setOpaque(false);设置控件透明

  8. Linux CPU 亲和性

    在Linux中,我们知道可以通过nice.renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行. 除了nice.renice外,可以通过CPU affinit ...

  9. UITextView 输入长度限制

    //还可以输入的长度. - (void)textViewDidChange:(UITextView *)textView { UITextRange *markRange = textView.mar ...

  10. 解决WCF 调用方未由服务器进行身份验证或消息包含无效或过期的安全上下文令牌

    错误描述: 1. WCF:调用方未由服务器进行身份验证 2. 无法处理消息.这很可能是因为操作“http://tempuri.org/ISCCLSvc/GetCarriersByWareHouse”不 ...