熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

基於Delphi的異常處理技術探究

2022-06-13   來源: Delphi編程 
    在程序運行過程中往往出現一些意外錯誤狀態而導致程序無法運行下去的情況因此 在實現程序功能的同時必須考慮如何處理程序運行過程中可能出現的各種異常情況所謂異常是指打斷程序正常流程的非常見或意外的狀態打開文件時按路徑找不到文件不能分配所需的內存等現本人結合實際就Delphi中異常的產生來源以及實現異常處理的方法進行探討

  異常的來源

  異常可由一些不同的資源產生用戶的程序可以因為不正常狀態產生異常Delphi的組件可以因為不同的事件產生異常把越界值賦給屬性或嘗試為不存在的數組元素建立索引 運行的庫過程和函數也能產生異常執行帶有非法操作的數學表達式如被0除肯定是異常 其他產生異常操作的例子包括引用nil指針執行非法類型轉換的表達式等總的來說軟件在運行過程中遇到的情況千差萬別因此產生異常的情況也各有不同

  傳統的異常處理方法

  對於程序運行過程中產生的異常情況傳統處理的方法主要是通過IF語句布爾型標志和特別函數返回值來控制如在加載文件時采用條件語句以處理可能產生的打開空文件的錯誤

If OpendialogFilename=nil then //判斷是否選擇文件
Begin
 ShowMessage( 選擇文件無效請重新選擇一個文件)
End
  以上例子是通過IF語句判斷到異常事件後提示重新操作這種異常處理方法當然很容易理解但在軟件編寫的過程中如果每個地方都使用IF語句來檢查錯誤並處理異常會使編程工作變得較為繁雜在Delphi中這個問題可以用更簡便的方法來實現異常處理

  Delphi 中的異常處理方法

  Delphi支持多種異常處理機制Object Pascal提供了高級的異常處理機制在這裡就兩種異常處理方法進行探討

  創建被保護語句塊

  所謂被保護語句塊簡單說是一條或多條語句帶有對這些語句產生異常的處理器運用try和except關鍵字來創建被保護語句塊的結構具體結構如下

Try  //可能引起異常的代碼段
···
except  //對異常進行處理的代碼段
···
end
  其中try和except為關鍵字try用於標志可能產生異常的代碼段如果這段程序在運行時產生了異常系統會中止try代碼段的執行並根據except所設的代碼段進行

  下面就如何利用這個結構來創建被保護語句塊研究一個程序的例子具體的調用事件處理過程主要代碼如下

var
 IJKInteger
Begin
 I=J=
Try
 K=J DIV I //產生異常的語句
Except
 ShowMessage ( Divede error! + I=+ IntToStr ( I ) + J + IntToStr ( J ) +k= + IntToStr ( K ))
End
  在這個過程中表達式JdivI嘗試用除以使Object Pascal運行庫產生一個異常從而執行了except塊中的ShowMessage語句這個保護語句控制程序的執行過程主要有以下三個要點

  () 如果except塊中的一條語句處理了一個異常過程或函數在保護塊後面繼續正常運行

  () 如果沒有語句處理異常當前的過程或函數立即退出異常查找調用鏈直到找到合適的處理器

  () 未處理的異常最終找到應用程序的缺省異常處理器處理器顯示對話框和消息 缺省異常處理器接收所有沒有提供處理的異常

  創建被保護資源塊

  以上的例子顯示錯誤消息僅僅是異常處理的一個方面當產生異常情況時一個可靠的應用程序必須恢復穩定性如果發生磁盤錯誤應用程序必須釋放可能不用的內存快直到用戶重新啟動一個可靠的程序很容易排除錯誤通過關閉文件釋放Windows資源用任何可能的方法從混亂中恢復這種情況可用try 和finally關鍵字來創建被保護資源塊所謂被保護資源塊簡單說是由一條或多條語句組成帶有對資源使用可能產生異常的處理器 這個保護資源塊的基本框架結構為

try     //程序語句
···
finally // 釋放的資源
···
end
  在這個結構中不管try塊中的語句是否產生異常finally塊中的語句總是要執行的在典型的情況下finally塊中的語句釋放內存關閉文件執行其他必須完成的操作來恢復系統穩定性如果是try塊外的語句產生異常就會立刻引起過程或過程跳出跳過finally塊需要注意的一點是分配語句不要放在try塊中即使它將產生一個異常也是如此{例如由於RAM 的缺陷而使內存分配失誤}finally塊的目的是釋放資源因此必須在try塊前放置分配語句在該塊中插入任何可以產生異常的語句或可以讓過程或函數退出以讓分配的資源懸掛直到用戶重新啟動的語句下面結合實際例子來探討這種技術並且顯示如何使用被保護資源塊來防止懸掛資源具體的過程主要代碼如下

var
 IJKInteger
 PPointer
Begin
 I=J=//給變量初值
 GETmem ( P )//分配內存資源
Try
 K= J div I
 var
  I J K Integer
  P Pointer
 Begin
  I  J  //給變量初值
  GETmem(P  //分配內存資源
  Try
   K=J div I
  Except
   ShowMessage ( RRSULTS I+ IntToStr ( I ) + J + IntToStr ( J ) +KI + IntToStr ( K ))
  Finally
   FreeMem ( P ) ; //釋放內存資源
  ShowMessage( 已經釋放內存)
End
  上述過程與被保護語句塊相似只是增加了一條分配內存的語句這條語句調用GetMem 來保存4098 個字節的內存當產生異常情況時程序由於設置了被保護資源塊使得占用內存的資源得以釋放另外程序中潛在的錯誤除法表達式存在於try塊中如果除法不在try中這條語句的執行就將產生異常過程會立刻結束

  結束語

  在程序中加入異常處理結構以達到對異常的控制這種處理方法在編寫程序的過程中非常有用有人可或許認為異常處理很復雜或者用處不大其實異常處理並不復雜無非是中斷產生異常的程序代碼捕捉可能產生的異常並進行相應處理掌握了這一基本方法後就理解運用異常處理機制的重要性以及如何使用異常處理機制了
From:http://tw.wingwit.com/Article/program/Delphi/201311/24897.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.