📄 028.htm
字号:
lang="ZH-CN">、</font>EOutOfResource<font face="宋体" lang="ZH-CN">在</font>Controls<font
face="宋体" lang="ZH-CN">单元中定义;</font>EComponentError<font face="宋体"
lang="ZH-CN">在</font>Classes<font face="宋体" lang="ZH-CN">单元中定义。</p>
<p> </font>1.<font face="宋体" lang="ZH-CN">非法操作异常</font>
EInvalidOperation</p>
<font face="宋体" lang="ZH-CN"><p> </font>EInvalidOperation <font face="宋体"
lang="ZH-CN">引发的原因可能有:</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">应用程序试图对一个</font>Parent<font
face="宋体" lang="ZH-CN">属性为</font>nil<font face="宋体" lang="ZH-CN">的部件进行一些需要</font>Windows<font
face="宋体" lang="ZH-CN">句柄的操作</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">试图对一个窗口进行拖放操作</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">操作违反了部件属性间内置的相互关系等 </p>
<p> 例如,</font>ScrollBar<font face="宋体" lang="ZH-CN">、</font>Gauge<font
face="宋体" lang="ZH-CN">等部件要求</font>Max<font face="宋体" lang="ZH-CN">属性大于等于</font>Min<font
face="宋体" lang="ZH-CN">属性,因而下面的语句: </p>
<p> </font>ScrollBar1.Max := ScrollBar1.Min-1;</p>
<font face="宋体" lang="ZH-CN"><p> </font> <font face="宋体" lang="ZH-CN">将引发一个</font>EInvalidOperation<font
face="宋体" lang="ZH-CN">异常。 </p>
<p> </font>2.<font face="宋体" lang="ZH-CN">部件异常</font>EComponentError</p>
<p><font face="宋体" lang="ZH-CN">引发该异常的原因可能有:</p>
</font><p><font face="宋体" lang="ZH-CN"> ● 在Register过程之外试图登录一个部件(常用于自定义部件开发中)
</font></p>
<font face="宋体" lang="ZH-CN"><p> ●</font> <font face="宋体" lang="ZH-CN">应用程序在运行中改变了一个部件的名称并使该部件与另一个部件重名</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">一个部件的名称改变为一个</font>Object
Pascal<font face="宋体" lang="ZH-CN">非法的标识符</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">动态生成一个部件与已存在的另一部件重名 </p>
</font><p>3.<font face="宋体" lang="ZH-CN">资源耗尽异常</font>EOutOfResource</p>
<p><font face="宋体" lang="ZH-CN">当应用程序试图创建一个</font>Windows<font
face="宋体" lang="ZH-CN">句柄而</font>Windows <font face="宋体" lang="ZH-CN">却没有多余的句柄分配时引发该异常。 </p>
</font><p>12.1.3.2 <font face="宋体" lang="ZH-CN">专用部件异常类 </p>
<p> 许多部件都定义了相应的部件异常类。但并不是有关部件的任何错误都会引发相应的异常类。许多情况下它们将引发一个运行时间异常或对象异常。</p>
<p> 下面列出几个典型的部件异常类。</p>
<p> </font>1.EMenuError</p>
<p><font face="宋体" lang="ZH-CN">非法的菜单操作,例如试图删除一个不存在的菜单项。这一异常类在</font>Menus<font
face="宋体" lang="ZH-CN">库单元中定义。</p>
<p> </font>2.EInvalidGridOpertion</p>
<font face="宋体" lang="ZH-CN"><p> 非法的网格操作,比如试图引用一个不存在的网格单元。这一异常类在</font>Grids<font
face="宋体" lang="ZH-CN">库单元中定义。</p>
<p> </font>3.EDDEError</p>
<font face="宋体" lang="ZH-CN"><p> </font>DDE<font face="宋体" lang="ZH-CN">异常。比如应用程序找不到特定的服务器或会话,或者一个联接意外中止。这一异常类在</font>DDEMan<font
face="宋体" lang="ZH-CN">库单元中定义。</p>
<p> </font>4.EDatabaseError<font face="宋体" lang="ZH-CN">,</font>EReportError</p>
<font face="宋体" lang="ZH-CN"><p> 数据库异常</font>(EDatabaseError)<font
face="宋体" lang="ZH-CN">和报表异常</font>(EReportError) <font face="宋体"
lang="ZH-CN">在进行数据库和报表操作出现错误时引发。有关数据库的问题请读者参阅本书第二编。 </p>
</font><p>12.1.4 <font face="宋体" lang="ZH-CN">小结 </p>
<p> 在这一节中重点介绍了</font>Delphi<font face="宋体" lang="ZH-CN">提供的异常类体系。我们力求给读者一个清晰、全面的印象,使读者能在自己的程序开发中实际使用它们。为便于理解我们也提供了一些简单的说明性示例。虽然在具体的使用中读者还可能会碰到许多问题,但意识到应该用异常类来增强程序的健壮性却是程序设计水平走上新台阶的标志。 </p>
</font><p align="center">12.2 <font face="宋体" lang="ZH-CN">异常保护 </p>
<p> 确保回收分配的资源是程序健壮性的一个关键。但缺省情况下异常发生时程序会在出错点自动退出当前模块,因此需要一种特殊的机制来确保即使在异常发生的情况下释放资源的语句仍能被执行。而</font>Delphi<font
face="宋体" lang="ZH-CN">的异常处理正提供了这种机制。 </p>
</font><p>12.2.1 <font face="宋体" lang="ZH-CN">需要保护的资源 </p>
<p> 一般说来需要保护的资源包括:</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">文件</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">内存</p>
<p> ●</font> Windows<font face="宋体" lang="ZH-CN">资源</p>
<p> ●</font> <font face="宋体" lang="ZH-CN">对象 </p>
<p> 比如下面一段程序就会造成</font>1K<font face="宋体" lang="ZH-CN">内存资源的丢失。 </p>
</font><p>var</p>
<p>APointer : Pointer ;</p>
<p>AInt , ADiv: Integer ;</p>
<p>begin</p>
<p>ADiv := 0;</p>
<p>GetMem ( APointer , 1024 );</p>
<p>AInt := 10 div ADiv ;</p>
<p>FreeMem ( Apointer , 1024 );</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">由于程序从异常发生点退出从而</font>FreeMem<font
face="宋体" lang="ZH-CN">永远没有执行的机会。 </p>
</font><p>12.2.2 <font face="宋体" lang="ZH-CN">产生一个资源保护块 </p>
<p> </font>Delphi<font face="宋体" lang="ZH-CN">提供了一个保留字</font>finally<font
face="宋体" lang="ZH-CN">,用于实现资源的保护: </p>
<p> {分配资源}</p>
<p> </font>try</p>
<p>{<font face="宋体" lang="ZH-CN">资源使用情况}</font></p>
<p>finally</p>
<p>{<font face="宋体" lang="ZH-CN">释放资源}</p>
<p> </font>end; </p>
<p>try<font face="宋体" lang="ZH-CN">…</font>finally<font face="宋体" lang="ZH-CN">…</font>end<font
face="宋体" lang="ZH-CN">就形成了一个资源保护块。</font>finally<font
face="宋体" lang="ZH-CN">后面的语句是在任何情况下,不论程序是否发生异常,都会执行的。</p>
<p> 对于</font>(12.2.1)<font face="宋体" lang="ZH-CN">中的例子如下代码即可确保所分配内存资源的释放: </p>
</font><p>var</p>
<p>APointer : Pointer ;</p>
<p>AInt , ADiv : Integer;</p>
<p>begin</p>
<p>ADiv := 0;</p>
<p>GetMem ( APointer , 1024 );</p>
<p>try</p>
<p>AInt := 10 div ADiv ;</p>
<p>finally</p>
<p>FreeMem ( Apointer , 1024 );</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋体" lang="ZH-CN">下面的例子摘自</font>(6.4)<font face="宋体"
lang="ZH-CN">节,是在文件拷贝中实现文件资源的保护: </p>
</font><p>procedure CopyFile(const FileName, DestName: TFileName);</p>
<p>var</p>
<p>CopyBuffer: Pointer; </p>
<p>TimeStamp, BytesCopied: Longint;</p>
<p>Source, Dest: Integer; </p>
<p>Destination: TFileName; </p>
<p>const</p>
<p>ChunkSize: Longint = 8192; </p>
<p>begin</p>
<p>Destination := ExpandFileName(DestName); </p>
<p>if HasAttr(Destination, faDirectory) then </p>
<p>Destination := Destination + '\' + ExtractFileName(FileName); </p>
<p>TimeStamp := FileAge(FileName); </p>
<p>GetMem(CopyBuffer, ChunkSize); </p>
<p>try</p>
<p>Source := FileOpen(FileName, fmShareDenyWrite); </p>
<p>if Source < 0 then </p>
<p>raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));</p>
<p>try</p>
<p>Dest := FileCreate(Destination); </p>
<p>if Dest < 0 then </p>
<p>raise EFCreateError.Create(FmtLoadStr(SFCreateError, [Destination]));</p>
<p>try</p>
<p>repeat</p>
<p>BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); </p>
<p>if BytesCopied > 0 then </p>
<p>FileWrite(Dest, CopyBuffer^, BytesCopied); </p>
<p>until BytesCopied < ChunkSize; </p>
<p>finally</p>
<p>FileClose(Dest); </p>
<p>end;</p>
<p>finally</p>
<p>FileClose(Source); </p>
<p>end;</p>
<p>finally</p>
<p>FreeMem(CopyBuffer, ChunkSize); </p>
<p>end;</p>
<p>end;</p>
<p><font face="宋体" lang="ZH-CN">程序的具体解释见</font> (6.4)<font
face="宋体" lang="ZH-CN">节。</p>
<p> 在异常保护的情况下,当异常发生时,系统会自动弹出一个消息框用于显示异常的消息。退出当前模块后异常类自动清除。</font></p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="029.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="027.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -