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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

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

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

6、tName; Reset(lnFile; $l+此編譯 器指令恢復(fù) I/O 檢測(cè)If IOResult0 then錯(cuò)誤處理代碼;使用異常進(jìn)行錯(cuò)誤處理 結(jié) 構(gòu)化異常處理是 Delphi 語(yǔ)言?xún)?nèi)建的特性.為我們處理異常提供了方便.處理異常有兩 方面:1 異常處理可確保適當(dāng)?shù)鼗謴?fù)在應(yīng)用程序中分配或改變的任何資源.2 結(jié)構(gòu)化異常處理為開(kāi)發(fā)人員提供了一種一致的處理各種類(lèi)型運(yùn)行期錯(cuò)誤的方式Delphi7 異常處理機(jī)制異常處理的基本思想是通過(guò)提供規(guī)范方式處理軟,硬件錯(cuò)誤的能力,使程序更加健壯.異常處理可以將處理錯(cuò)誤的代碼與正常的邏輯處理代碼相分離.Delphi缺省的方式是在應(yīng)用程序收到異常之前捕獲異常.ID

7、E 會(huì)給出一個(gè)”預(yù)警”對(duì)話(huà)框,以 指明應(yīng)用程序?qū)⒁a(chǎn)生異常.異常處理機(jī)制是一種程序設(shè)計(jì)安全策略,它是建立在保 護(hù)塊思想上,通過(guò) try 和 end 語(yǔ)句塊對(duì)代碼的封裝確保在程序發(fā)生異常時(shí),程序能夠正 常運(yùn)行或釋放所占用的資源.Delphi7 異常處理機(jī)制傳統(tǒng)程序設(shè)計(jì)中,用如下的偽代 碼方法來(lái)檢查和處理程序錯(cuò)誤:執(zhí)行一個(gè)任務(wù) If 前一個(gè)任務(wù)未能正確執(zhí)行 執(zhí)行錯(cuò)誤 處理執(zhí)行下一個(gè)任務(wù) If前一個(gè)任務(wù)未能正確執(zhí)行 執(zhí)行錯(cuò)誤處理 Delphi7 異常 處理機(jī)制 例;try Age :=StrToInt(Edit1.Text; ShowMessage(Format(生于 %d 年, YearOf(No

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

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

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

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

12、未初始化指針或?qū)ο笤斐蒃InvalidOpCode 處理器遇到未定義指令堆異常和(I/O 異常堆異常:EOutOfMemory 堆中沒(méi)有足夠的內(nèi)存完成操作EInvalidPointer 試圖訪問(wèn)一個(gè)堆外的指針(I/O 異常 EInOutError DOS 輸入/輸出錯(cuò)誤 字符轉(zhuǎn)換/類(lèi)型轉(zhuǎn)換異常和啞異常 字符轉(zhuǎn)換異常 EConvertError 數(shù)字到字符串或字符 串到數(shù)字轉(zhuǎn)換錯(cuò)誤類(lèi)型轉(zhuǎn)換異常 EInvalidCast 類(lèi)型轉(zhuǎn)換異常啞異常 EAbort 調(diào)用 Abort 產(chǎn)生,不顯示錯(cuò)誤提示框 對(duì)象異常類(lèi) 對(duì)象異常類(lèi)是針對(duì)非組件對(duì)象引發(fā)的異 常而定義的.對(duì)象異常類(lèi)包括:1 流異常類(lèi) 2 打印異常

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論