?? 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">引發(fā)的原因可能有:</p>
<p> ●</font> <font face="宋體" lang="ZH-CN">應(yīng)用程序試圖對一個</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">操作違反了部件屬性間內(nèi)置的相互關(guān)系等 </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">將引發(fā)一個</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">引發(fā)該異常的原因可能有:</p>
</font><p><font face="宋體" lang="ZH-CN"> ● 在Register過程之外試圖登錄一個部件(常用于自定義部件開發(fā)中)
</font></p>
<font face="宋體" lang="ZH-CN"><p> ●</font> <font face="宋體" lang="ZH-CN">應(yīng)用程序在運行中改變了一個部件的名稱并使該部件與另一個部件重名</p>
<p> ●</font> <font face="宋體" lang="ZH-CN">一個部件的名稱改變?yōu)橐粋€</font>Object
Pascal<font face="宋體" lang="ZH-CN">非法的標(biāo)識符</p>
<p> ●</font> <font face="宋體" lang="ZH-CN">動態(tài)生成一個部件與已存在的另一部件重名 </p>
</font><p>3.<font face="宋體" lang="ZH-CN">資源耗盡異常</font>EOutOfResource</p>
<p><font face="宋體" lang="ZH-CN">當(dāng)應(yīng)用程序試圖創(chuàng)建一個</font>Windows<font
face="宋體" lang="ZH-CN">句柄而</font>Windows <font face="宋體" lang="ZH-CN">卻沒有多余的句柄分配時引發(fā)該異常。 </p>
</font><p>12.1.3.2 <font face="宋體" lang="ZH-CN">專用部件異常類 </p>
<p> 許多部件都定義了相應(yīng)的部件異常類。但并不是有關(guān)部件的任何錯誤都會引發(fā)相應(yīng)的異常類。許多情況下它們將引發(fā)一個運行時間異?;?qū)ο螽惓!?lt;/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> 非法的網(wǎng)格操作,比如試圖引用一個不存在的網(wǎng)格單元。這一異常類在</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">異常。比如應(yīng)用程序找不到特定的服務(wù)器或會話,或者一個聯(lián)接意外中止。這一異常類在</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> 數(shù)據(jù)庫異常</font>(EDatabaseError)<font
face="宋體" lang="ZH-CN">和報表異常</font>(EReportError) <font face="宋體"
lang="ZH-CN">在進行數(shù)據(jù)庫和報表操作出現(xiàn)錯誤時引發(fā)。有關(guān)數(shù)據(jù)庫的問題請讀者參閱本書第二編?!?lt;/p>
</font><p>12.1.4 <font face="宋體" lang="ZH-CN">小結(jié) </p>
<p> 在這一節(jié)中重點介紹了</font>Delphi<font face="宋體" lang="ZH-CN">提供的異常類體系。我們力求給讀者一個清晰、全面的印象,使讀者能在自己的程序開發(fā)中實際使用它們。為便于理解我們也提供了一些簡單的說明性示例。雖然在具體的使用中讀者還可能會碰到許多問題,但意識到應(yīng)該用異常類來增強程序的健壯性卻是程序設(shè)計水平走上新臺階的標(biāo)志?!?lt;/p>
</font><p align="center">12.2 <font face="宋體" lang="ZH-CN">異常保護 </p>
<p> 確保回收分配的資源是程序健壯性的一個關(guān)鍵。但缺省情況下異常發(fā)生時程序會在出錯點自動退出當(dāng)前模塊,因此需要一種特殊的機制來確保即使在異常發(fā)生的情況下釋放資源的語句仍能被執(zhí)行。而</font>Delphi<font
face="宋體" lang="ZH-CN">的異常處理正提供了這種機制?!?lt;/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">內(nèi)存</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">內(nèi)存資源的丟失?!?lt;/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">由于程序從異常發(fā)生點退出從而</font>FreeMem<font
face="宋體" lang="ZH-CN">永遠沒有執(zhí)行的機會。 </p>
</font><p>12.2.2 <font face="宋體" lang="ZH-CN">產(chǎn)生一個資源保護塊 </p>
<p> </font>Delphi<font face="宋體" lang="ZH-CN">提供了一個保留字</font>finally<font
face="宋體" lang="ZH-CN">,用于實現(xiàn)資源的保護: </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">后面的語句是在任何情況下,不論程序是否發(fā)生異常,都會執(zhí)行的。</p>
<p> 對于</font>(12.2.1)<font face="宋體" lang="ZH-CN">中的例子如下代碼即可確保所分配內(nèi)存資源的釋放: </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">節(jié),是在文件拷貝中實現(xiàn)文件資源的保護: </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">節(jié)。</p>
<p> 在異常保護的情況下,當(dāng)異常發(fā)生時,系統(tǒng)會自動彈出一個消息框用于顯示異常的消息。退出當(dāng)前模塊后異常類自動清除。</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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -