异常处理与调试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]