Delphi異常處理tryexcept語句和tryfin(精)_第1頁
Delphi異常處理tryexcept語句和tryfin(精)_第2頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一、異常的來源在 Delphi 的應用程序中,下列的情況都比較有可能產生異常。(1)文件處理(2)內存分配(3)Windows資源(4)運行時創(chuàng)建對象和窗體(5)硬件和操作系統(tǒng)沖突二、異常的處理(1) tryexceptend;在 try 體內的代碼發(fā)生異常時,系統(tǒng)將轉向 except 部分進行異常的處理。這是 Delphi 處理異常的最基本的方 式之一。(2) tryfin ally end;這種異常處理結構一般用于保護 Windows 的資源分配等方面,它確保了無論 try 體內的代碼是否發(fā)生異常,都需 要由系統(tǒng)進行最后的統(tǒng)一處理的一些 Windows 對象的正確處理。和tryexcept

2、e 不同,該結構的 fin ally 部分總被執(zhí)行。(3)不存在tryexceptfin ally結構來既處理異常,又保護資源分配的結構,但是,tryexcepte 結構允許嵌套到 tryfin ally e 結構中,從而實現(xiàn)既處理異常, 又保護資源的分配。三、異常的精確處理(1)定義一個異常。在 Delphi 中,每個異常都是 Exception1類的一個派生類2。因此,定義一個異常 就是定義一個 Exception 類的派生類。type EMyException =class(Exception;當然,基類可以是 Exception 或者 Exception 的任何一個任何層次的派生類。(

3、2)在程序中拋出一個異常。根據(jù)不同的情況拋出異常是使用異常的最基本的模式。在Delphi 中,由 raise 語句來實現(xiàn)?!菊Z法】raise 異常類.Create(,異常的缺省說明?;(3)在 tryexceptend中更加精確的捕捉異常。使用 on E:異常類 do結構可以在 do 體內處理特定異常類所拋出的異常。四、異常的調試在 Delphi IDE 中,解除“ Debugger Options(可以使用菜單 Tools Debugger Options 進行訪問)中的 Integrated Debugg ing 復選框的勾選狀態(tài)可以進行異常的調試。五、異常的補充說明(1)每一段程序都有可

4、能產生錯誤!這是軟件業(yè)的一個不容置疑的現(xiàn)象和規(guī)律。事實上,傳統(tǒng)的 ifelse 結構完全可以解決所有的錯誤,使用 Exception機制也沒能夠回避在最原始的層次,通過遍歷可能的情況來產生異常的 做法,那么,為什么還要異常機制?答案很清楚:異常提供了一種更加靈活和開放的方式,使得后來的編程者可以來根據(jù)實際的情況處理這種錯誤,而不 是使用預先設定好的處理結果。Delphi7 異常處理了解什么是異常和 Delphi7 中提供的異常類 掌握 Delphi7 環(huán)境下自定義異常的方法和異常 處理的語法結構與實現(xiàn) 異常什么是異常程序開發(fā)過程中,有編譯期錯誤和運行期錯誤,編譯期錯誤很容易發(fā) 現(xiàn),而運行期錯誤

5、(邏輯錯誤和異常往往很難預料.為了程序的穩(wěn)定性和可靠性,就需 要對程序異常處理和保護異常:理解為一種特殊的事件,該事件發(fā)生時,程序的正常 執(zhí)行將被打斷.由程序導致的不正常情況是錯誤而不是異常,程序錯誤與異常不是相 同的概念.異常是為方便用戶報告錯誤并處理錯誤而創(chuàng)建的機制,一般是由操作系統(tǒng)完成的.運行期錯誤處理 軟件開發(fā)過程中,程序員必須提供適度的方式來處理不可避 免的錯誤.一般方法如下:1 傳統(tǒng)方法 2 使用異常進行錯誤處理 傳統(tǒng)方法在 Pascal 早期版本中,程序員必須借助編譯器開關和狀態(tài)變量去檢測和處理存在的錯誤.$1-此編譯器指令關閉 I/O 檢測 Assign(lnFile,lnpu

6、tName; Reset(lnFile; $l+此編譯 器指令恢復 I/O 檢測If IOResult0 then錯誤處理代碼;使用異常進行錯誤處理 結 構化異常處理是 Delphi 語言內建的特性.為我們處理異常提供了方便.處理異常有兩 方面:1 異常處理可確保適當?shù)鼗謴驮趹贸绦蛑蟹峙浠蚋淖兊娜魏钨Y源.2 結構化異常處理為開發(fā)人員提供了一種一致的處理各種類型運行期錯誤的方式Delphi7 異常處理機制異常處理的基本思想是通過提供規(guī)范方式處理軟,硬件錯誤的能力,使程序更加健壯.異常處理可以將處理錯誤的代碼與正常的邏輯處理代碼相分離.Delphi缺省的方式是在應用程序收到異常之前捕獲異常.ID

7、E 會給出一個”預警”對話框,以 指明應用程序將要產生異常.異常處理機制是一種程序設計安全策略,它是建立在保 護塊思想上,通過 try 和 end 語句塊對代碼的封裝確保在程序發(fā)生異常時,程序能夠正 常運行或釋放所占用的資源.Delphi7 異常處理機制傳統(tǒng)程序設計中,用如下的偽代 碼方法來檢查和處理程序錯誤:執(zhí)行一個任務 If 前一個任務未能正確執(zhí)行 執(zhí)行錯誤 處理執(zhí)行下一個任務 If前一個任務未能正確執(zhí)行 執(zhí)行錯誤處理 Delphi7 異常 處理機制 例;try Age :=StrToInt(Edit1.Text; ShowMessage(Format(生于 %d 年, YearOf(No

8、w - Age; except onECo nvertError do showmessage 輸入編輯框的不是一 個有效的數(shù)字!; on ERangeErrordo showmessage 輸入編輯框的年齡值太大!; end;異 常類 Delphi7 根據(jù)異常類型定義了相應的異常類.所有異常類的基類都是 Exception 類.Delphi7 內置了大量的異常類,用戶也可以通過 Exception 類自定義異常類.記住異常類的要點:1 異常類是響應不同異常現(xiàn)象的入口 2 熟悉異常類的層次結構.Exception 異常類 Exception 是所有異常類的基類,它并不是以?T開頭,而是以?E5

9、T頭,它的派生類也是以?EFF 頭的.Exception 類定義于 SysUtils 單元中.Exception 類最常用的方法是 Create 方法:Con structor Create(c on st Msg:stri ng;Exception.Create(我自己創(chuàng)建的異常!?;該方法用于創(chuàng)建一個異常類的實例 也可以 顯示錯誤信息,也可直接用這個方法提交一個異常raise Exception.Create 俄拋出的異常!?;例:try raise Exception.Create 俄拋出的異常!; except on E: Exception doshowmessage 異常類名稱:+

10、 E.ClassName + #13#10 + 異常信息:+ E.Message;end;Delphi7 內置的異常類 Delphi7 根據(jù)異?,F(xiàn)象的類型定義了相應的異常類,這些 異常類又稱為 Delphi7 內置的異常類.具體分為運行時庫異常類,對象異常類和組件 異常類三大類.運行時庫異常類(RTL 運行時庫異常類可分為以下幾種:1 整數(shù)計算 異常 2 浮點計算異常 3 硬件異常 4 堆異常 5 輸入輸出異常(I/O 異常 6 字符轉換異常 7 類型轉換異常 8 啞異常 整數(shù)計算異常 EIntError 整數(shù)計算異常(基類 EDivByZero 整數(shù)除 0 溢處 EIntOverFlow整數(shù)

11、溢出ERangeError整數(shù)越界浮點計算異常 EMathError浮點計算異常(基類EInvalidOp無效浮點操作指令 Eoverflow浮點操作 上溢 Eunderflow浮點操作下溢 EZeroDivide浮點計算除 0 硬件異常EProcessorException 硬件異常(基類 ESingleStep 應用程序產生單步中斷 Ebreakpoint 應用程序產生斷點中斷 Efault 故障(繼承 EProcessorException 也是基類 EStackFault 對處理器棧段的非法訪問 EPageFault 內存管理器無法正確使用交換文件 EGPFault 保護性錯誤,一般由

12、未初始化指針或對象造成EInvalidOpCode 處理器遇到未定義指令堆異常和(I/O 異常堆異常:EOutOfMemory 堆中沒有足夠的內存完成操作EInvalidPointer 試圖訪問一個堆外的指針(I/O 異常 EInOutError DOS 輸入/輸出錯誤 字符轉換/類型轉換異常和啞異常 字符轉換異常 EConvertError 數(shù)字到字符串或字符 串到數(shù)字轉換錯誤類型轉換異常 EInvalidCast 類型轉換異常啞異常 EAbort 調用 Abort 產生,不顯示錯誤提示框 對象異常類 對象異常類是針對非組件對象引發(fā)的異 常而定義的.對象異常類包括:1 流異常類 2 打印異常

13、類 3 圖形異常類 4 字符串鏈表 異常類流異常類流異常是指在程序中進行與流相關的操作時產生的異常.流異常類 的基類是 EStreamError 其他流異常類都直接或間接從它派生.派生關系見書 48 頁 圖打印異常 打印異常是由于應用程序向不存在的打印機發(fā)送打印命令或由于某種 原因打印工作無法送到打印機時引發(fā)的.打印異常類為 Eprinter,定義于 Printers 單元 圖形異常 圖形異常主要包括 EInvalidGraphic 和EInvalidGraphicOperation 兩個類均 定義于 Graphics 單元 EI nvalidGraphic 異常滿足下列情況之一時引發(fā):當應用

14、程序試圖向 一個并不包含合法的位圖,圖象,元文件或用戶自定義圖形類型的文件中裝入圖象時. 當應用程序試圖裝入不可識別擴展名的文件時當圖象與 LoadFromClipboardFormat或 SaveToClipboardFormat中的格式不匹配時.當應用程序試圖將圖象的 PixelFormat設為不支持的值 EInvalidGraphicOperati。n 異常在滿足下列條件之一時 發(fā)生:應用程序訪問圖象中不存在的掃描線時.應用程序不能成功寫入圖象時.應用 程序在畫布未處于有效狀態(tài)時進行繪制.應用程序裝入未知或不支持的圖象格式時. 應用程序將圖象的PixelFormat設為不支持的值時不能分

15、配該操作的句柄時.字符 串鏈表異常 字符串鏈表異常是由于用戶對字符串鏈表進行非法操作時引發(fā)的.包括EStringListError,EListError 等.由于許多部件都有一個 Tstrings 抽象類的屬性(如 Tiistbox組件的 Items 屬性等,因而字符串鏈表異常在組件編程中很重要.EStringListError 一般在字符串鏈表越界時產生.而 EListError 異常通常在以下情況下 發(fā)生:當索引項超出鏈表范圍時當字符串鏈表的 Duplicates 屬性設置為 dupError 同 時應用程序試圖加入一個重復的字符串時.當向已排序的字符串鏈表中插入字符串 時.組件異常類組件

16、異常類用于響應組件異常,組件異常是由于對 VCL 組件進行操 作時,違反了組件的使用規(guī)則及其特征而引發(fā)的,可分為兩大類:通用組件異常、專 用組件異常、通用組件異常。常見的有非法操作異常,組件異常和資源不足異常三種類型,對應于 EInvalidOpetation,EComponentError 和 EOutOfResource 異常類.引發(fā) 非法操作異常的原因有:應用程序試圖對 Pare nt 屬性為 nil 的組件進行一些需要窗 口句柄的操作.試圖對窗體拖放操作.引發(fā)組件異常的原因有:Delphi 不能注冊某個 組件應用程序不能重命名某個組件資源不足異常被引發(fā)是由于當應用程序試圖創(chuàng) 建窗口句柄

17、而操作系統(tǒng)沒有多余的句柄可分配專用組件異常:許多組件都定義了相應的組件異常類.列出幾個典型的組件異常類:EMenuError 異常菜單異常,是由于程 序對菜單的非法操作而引發(fā)的.定義于 Memus 單元 ElnvalidGridOperation 異常.非法的網(wǎng)格操作,如試圖引用一個不存在的網(wǎng)格單元時引發(fā)定義于 Grids 單元 EDatabaseErro異常.數(shù)據(jù)庫異常是由于對數(shù)據(jù)庫的非法操作引起的用戶自定義異 常類創(chuàng)建用戶自定義異常類的方法拋出自定義異常 用戶自定義異常類與內置異常類的區(qū)別異常類對象與其他類對象的區(qū)別創(chuàng)建用戶自定義異常類的方法選擇 Exception 作為基類,按照定義類的

18、一般方法,建立自定義的異常類就可以了 .如:type EMyException = class(Exception /需要定義屬性或方法時,寫在此處即可 end;拋出自定義異常 Delphi 不會管理用戶自定義異常的拋出,程序員必須自己拋出自己 創(chuàng)建的異常 用 raise 語句可拋出異常:raise EMyException.Create(My Exception;用戶 自定義異常類與內置異常類的區(qū)別Delphi 不會自動響應用戶自定義的異常類,所以用戶自定義的異常類需要使用 raise 語句拋出,而內置異常類與運行期真實的異?,F(xiàn) 象相對應,當異常發(fā)生時,操作系統(tǒng)會捕捉到此異常,通知 Delp

19、hi 去響應.異常類對象 與其他類對象的區(qū)別異常類對象創(chuàng)建后,不需要由用戶釋放它,當異常處理之后,系統(tǒng) 會自動調用析構函數(shù)釋放異常類對象.而其他類需要由用戶來釋放.Delphi7 的異常 處理結構tryfin ally 語句塊 Tryexcept 語句塊使用 raise 拋出異常 tryfin ally 語 句塊 tryfin ally語句塊是用于資源保護和恢復系統(tǒng)狀態(tài),不管 try 部分的操作是否 有異常發(fā)生,fin ally 部分的操作都要進行.語法如下:try 被保護語句 fin ally 處理語句 (無論異常是否發(fā)生,都必須處理 en d;tryfin all 語句塊主要用于資源保護應用程序 向系統(tǒng)申請了資源(如內存,圖形句柄,當不需要這些資源時,就應該及時釋放資源.句 柄:系統(tǒng)資源是有限的,一般構成一個資源鏈,鏈的長度是有限的,當系統(tǒng)給應用程序 分配資源時,給每個資源設置一個 ID 號,這個 ID 號就是句柄.(系統(tǒng)資源相當于一個 個房間,而句柄就相當于房間號.句柄有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論