?? 028.htm
字號:
face="宋體" lang="ZH-CN">。其中</font>EInvalidOperation<font face="宋體"lang="ZH-CN">、</font>EOutOfResource<font face="宋體" lang="ZH-CN">在</font>Controls<fontface="宋體" 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<fontface="宋體" lang="ZH-CN">屬性為</font>nil<font face="宋體" lang="ZH-CN">的部件進行一些需要</font>Windows<fontface="宋體" 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<fontface="宋體" lang="ZH-CN">等部件要求</font>Max<font face="宋體" lang="ZH-CN">屬性大于等于</font>Min<fontface="宋體" 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<fontface="宋體" 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>ObjectPascal<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<fontface="宋體" lang="ZH-CN">句柄而</font>Windows <font face="宋體" lang="ZH-CN">卻沒有多余的句柄分配時引發該異常?!?lt;/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<fontface="宋體" lang="ZH-CN">庫單元中定義。</p><p> </font>2.EInvalidGridOpertion</p><font face="宋體" lang="ZH-CN"><p> 非法的網格操作,比如試圖引用一個不存在的網格單元。這一異常類在</font>Grids<fontface="宋體" lang="ZH-CN">庫單元中定義。</p><p> </font>3.EDDEError</p><font face="宋體" lang="ZH-CN"><p> </font>DDE<font face="宋體" lang="ZH-CN">異常。比如應用程序找不到特定的服務器或會話,或者一個聯接意外中止。這一異常類在</font>DDEMan<fontface="宋體" lang="ZH-CN">庫單元中定義。</p><p> </font>4.EDatabaseError<font face="宋體" lang="ZH-CN">,</font>EReportError</p><font face="宋體" lang="ZH-CN"><p> 數據庫異常</font>(EDatabaseError)<fontface="宋體" 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> 確?;厥辗峙涞馁Y源是程序健壯性的一個關鍵。但缺省情況下異常發生時程序會在出錯點自動退出當前模塊,因此需要一種特殊的機制來確保即使在異常發生的情況下釋放資源的語句仍能被執行。而</font>Delphi<fontface="宋體" 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">內存資源的丟失?!?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">由于程序從異常發生點退出從而</font>FreeMem<fontface="宋體" 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<fontface="宋體" 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<fontface="宋體" lang="ZH-CN">就形成了一個資源保護塊。</font>finally<fontface="宋體" 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)<fontface="宋體" lang="ZH-CN">節。</p><p> 在異常保護的情況下,當異常發生時,系統會自動彈出一個消息框用于顯示異常的消息。退出當前模塊后異常類自動清除。</font></p> <BR><hr width="94%"></TD><TD CLASS="tt3" VALIGN="bottom" width="8%" ><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></strong></TD></TR></table></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -