第6章 Delphi程序異常處理與調(diào)試技術(shù)_第1頁
第6章 Delphi程序異常處理與調(diào)試技術(shù)_第2頁
第6章 Delphi程序異常處理與調(diào)試技術(shù)_第3頁
第6章 Delphi程序異常處理與調(diào)試技術(shù)_第4頁
第6章 Delphi程序異常處理與調(diào)試技術(shù)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、青島世隆創(chuàng)新軟件科技有限公司- 平臺開發(fā)部 學(xué)習(xí)培訓(xùn)文檔第六章 程序異常處理與調(diào)試技術(shù)在Delphi中有兩種程序錯誤,一種是編譯錯誤,在程序編輯階段就可以由編譯器發(fā)現(xiàn)并給出提示。另外一種是運行錯誤,這類錯誤不能在編譯階段查出,只能在程序執(zhí)行時發(fā)現(xiàn),稱為運行錯誤。 Delphi提供了一種機制來處理運行錯誤,保護程序的正常執(zhí)行,這種機制就是異常處理。異常處理的方法是把正常的執(zhí)行程序同錯誤的處理程序分離開來,這樣可以保證在沒有錯誤時,程序正常執(zhí)行,當發(fā)生錯誤時,執(zhí)行錯誤處理部分的程序,然后程序跳出保護模塊,繼續(xù)執(zhí)行后續(xù)的程序 。6.1 Object Pascal異常的種類 異常的種類:Delphi內(nèi)

2、建的異常類,程序員自定義的異常類。異常基類及其屬性和主要方法:在Delphi中,所有異常的基類是Exception類。所有其他異常類都是由該類派生而來。 1 exception屬性該類有兩個基本屬性:HelpContext和Message。(1)Exception.HelpContext屬性 該屬性的定義如下: § Type ThelpContext= -MaxLongint.MaxLongint;§ Property HelpContext:ThelpContext;HelpContext是ThelpContext類的一個實例,它提供了與異常對象聯(lián)系在一起的上下文相關(guān)幫助

3、信息的序列號。該序列號決定當發(fā)生異常時用戶按F1鍵顯示的一個異常錯誤的幫助信息。 (2)Exception.Message屬性該屬性的定義如下: property Message: string 該屬性存儲異常發(fā)生時的錯誤信息。可以通過該屬性在提示錯誤對話框中顯示錯誤信息字符串。2exception方法(1)Exception.Create方法該方法的定義形式為: Constructor Create(Const Msg: String);該方法用來產(chǎn)生一個帶有一條簡單提示信息的對話框,對話框中的提示內(nèi)容由Msg提供(2)Exception.CreateFmt方法該方法的定義格式如下: Con

4、structor CreateFmt(Const Msg:String;Const Args:Array of Const) ;該方法用來產(chǎn)生一個帶有格式化字符串提示信息的對話框,格式化的字符串由Msg和Args數(shù)組共同提供,其中數(shù)組Args負責(zé)提供用于格式化的數(shù)值。(3)Exception.CreatHelp方法該方法的定義格式如下:Constructor CreateHelp(Const Msg:String; AhelpContsxt:Integer) ;該方法產(chǎn)生一個帶有一條簡單提示信息和上下文幫助序列號的提示對話框。其中Msg參數(shù)包含了顯示在異常對話框中的運行錯誤信息。AhelpCo

5、ntext參數(shù)包含一個限定異常錯誤信息上下文幫助序列號。 6.1.1 Delphi內(nèi)建的異常類 Delphi內(nèi)建立異常類其標識符的第一個字母都是“E”,如此我們很容易就能辨認出此種類。6.1.2自定義異常類 自定義的異常類必須繼承內(nèi)建的Exception類,或者繼承Exception的某個子類才行。除此之外,自定義異常類的語法和自定義一般類的語法并沒有不同 。6.2觸發(fā)異常的方法觸發(fā)異常的方法,主要可分為兩種,一種是由程序系統(tǒng)自動觸發(fā),一種則是利用raise指令觸發(fā)6.2.1由程序系統(tǒng)自動觸發(fā) 只要屬于Delphi內(nèi)建類的異常產(chǎn)生時,程序系統(tǒng)就會在當下自動觸發(fā)它們,并捕捉其信息,然后將異常的信

6、息以對話框顯示出來,這些是一般公認的異常狀況,即使我們不對這些異常做處理,程序系統(tǒng)也會幫我們做處理,然后讓程序再繼續(xù)執(zhí)行下去,這樣程序就不會在當時異常中斷,而出現(xiàn)意料之外的問題。不過程序系統(tǒng)所作的只是一般的處理,通常僅是避開執(zhí)行會發(fā)生異常的程序代碼,而不會排除掉異常發(fā)生的原因。故若保持原來的狀態(tài)再做同樣的執(zhí)行操作,仍舊會觸及同樣的異常,卻無法執(zhí)行下一步的程序。因此為了讓程序執(zhí)行更順暢,并且讓用戶更容易使用我們所開發(fā)的應(yīng)用程序。即使是程序系統(tǒng)自動觸發(fā)的異常,我們也應(yīng)該主動去處理,設(shè)法去除導(dǎo)致異常的原因?;蛘呓o予用戶更明確,更人性化的提示,盡量不要讓用戶感到任何操怍上的困難,并且避免異常重復(fù)發(fā)生而

7、浪費不必要的時間。6.2.2使用raise指令觸發(fā) 自行觸發(fā)異常的方式使用raise指令其語法如下: Raise 異常對象實體不要將raise指令當成一般語句使用,它必須配合異常處理語法來使用 。 6.3處理異常情況專門用來處理異常情況的語句主要有兩種,一種是“try_ except_end”結(jié)構(gòu),另一種則是“try_finally_end”結(jié)構(gòu) 。由于Delphi在程序設(shè)計時,提供了調(diào)試器(Debugger),因此當程序執(zhí)行時若發(fā)生異常狀況,調(diào)試器將發(fā)揮功能,讓程序在異常發(fā)生點,并且提示調(diào)試的方法,方便找出問題所在。然而這樣程序就無法如實展現(xiàn)異常處理的情況,而且這個應(yīng)用程序若不在Delphi

8、環(huán)境下執(zhí)行,也不會有調(diào)試器存在。因此在設(shè)計異常處理程序時,點選【Tools】|【Debugger Options】|【General】選項,然后取消【Integrated debugging】選項,這樣才能看到異常處理的效果6.3.1 TryFinallyEnd結(jié)構(gòu) TryFinallyEnd結(jié)構(gòu)只需要觸發(fā)異常,程序系統(tǒng)將自動捕捉被觸發(fā)的異常,然后以信息對話框顯示出異常的信息,讓程序避開發(fā)生異常的程序代碼,然后向下執(zhí)行程序。無論在“TryFinaly”區(qū)內(nèi)是否有異常被觸發(fā),都會接著執(zhí)行“FindlyEnd”區(qū)的語句。然而若是在“TryFinally”區(qū)內(nèi)有異常產(chǎn)生并被觸發(fā)時,就會由異常發(fā)生點跳

9、轉(zhuǎn)此區(qū)域,轉(zhuǎn)而執(zhí)行“FinallyEnd”區(qū)的所有語句。 例:procedure Form1.Button1Click(Sender:TO b j e c t ) ; Var MyStringList:TStringList;begin MyStringList:= TStringList.Create; try MyStringList.Assign(ListBox1.Items); finally MyStringList.Free; end;end;包括由程序系統(tǒng)自動觸發(fā)以及程序員使用raise指令去觸發(fā)的異常,故在本區(qū)可根據(jù)狀況條件來使用Raise指令。然而在本區(qū)使用raise指令,或

10、者由程序系統(tǒng)自動觸發(fā)某些異常時,程序系統(tǒng)并不一定會自動處理這些異常,這時程序就有可能會異常中斷,因此需要“ExceptEnd”區(qū)中捕捉異常,并且對異常作適當處理;也可仿照“TryFinallyEnd”語法,在“ExceptEnd”區(qū)對“TryExcept”區(qū)內(nèi)被觸發(fā)的異常作再次觸發(fā)(Reraise)的操作,即再次使用Raise指令,由程序系統(tǒng)自動捕捉異常,以信息對話框顯示出異常信息,然后讓程序避開異常,而不致于中斷程序。6.3.2 “ExceptEnd”區(qū)中的語句在“ExceptEnd”區(qū)中,可以有多個語句,但此處主要是放置用來捕捉異常的語句,其目的是讓程序仍自行捕捉異常,根據(jù)異常的類型決定要

11、做的處理操作,而此種語句也有它特定的語法: On 異常對象標識符:類型 do /異常對象標識符可有可無 語句; /(on identifier:type do statement) 上述語法是表示當指定類型的異常被觸發(fā)時,就執(zhí)行保留字“do”后面這個語句。反之若沒有這種類型的異常被觸發(fā),則不會執(zhí)行“do”后面的語句。在捕捉異常的語句之后,還可以有一個“Else”區(qū),在這個區(qū)域內(nèi)可以有一般的語句(包括raise指令)。若本區(qū)域內(nèi)沒有“Else”區(qū)域時,只要其內(nèi)有捕捉異常的語句存在,就不允許有一般語句(包括raise指令);倘若本區(qū)內(nèi)若有“Else”區(qū),則除了“Else”區(qū)域之外,并不允許有一般語

12、句存在于“ExceptElse”區(qū)域,否則將導(dǎo)致編譯錯誤。6.4 程序調(diào)試Delphi提供了一個功能強大的內(nèi)置調(diào)試器(Integrated Debugger) ,該調(diào)試器可以方便地查找程序中出現(xiàn)的運行時間錯誤和邏輯錯誤。所謂運行時間錯誤是指程序能正常編譯但在運行時出錯。邏輯錯誤是指程序設(shè)計和實現(xiàn)上的錯誤。 6.4.1調(diào)試的準備 1激活內(nèi)置調(diào)試器方法是:在Delphi集成開發(fā)環(huán)境中,選中【Tools】|【Debugger Options】|【General】頁的【Integrated Debugging】復(fù)選框。默認情況下該框被選中。2設(shè)置編譯和調(diào)試選項默認情況下,Delphi對有些錯誤和信息不

13、給出調(diào)試信息。可改變Delphi默認設(shè)置。單擊【Project】|【Options】|【Compiler】頁。 (1)Runtime Errors區(qū)域Range checking:檢查數(shù)組或是字符串的下標是否越界,默認時不檢測。I/O checking:檢測輸入輸出錯誤,默認檢測Overflow checking:整型操作溢出檢測,默認不檢測。選中該復(fù)選框調(diào)試器將對整數(shù)運算是否溢出做檢測,默認下不報告錯誤。(2)Debugging區(qū)域設(shè)置調(diào)試的信息。默認時幾乎全部選中。一般無須改變該區(qū)域的選項設(shè)置。Debug information:表產(chǎn)生調(diào)試信息。如果Debug Information 選中

14、會在單元文件 (.dcu) 中放置調(diào)試信息,文件字節(jié)變大但不影響速度。 Local symbols:產(chǎn)生局部變量的調(diào)試信息。Local Symbols選中會添加與所在類、過程、函數(shù)及對象方法中定義的標識符等有關(guān)調(diào)試信息。在程序調(diào)試時調(diào)試器會使用這些信息,但這些信息不會添加到可執(zhí)行文件中。除非在【Project】|【Options】|【Linker】頁面中選中【Include TD32 Debug Info】選項,選中了此選項就可以使用TD32來調(diào)試。Reference info/Definitions only:用來產(chǎn)生 供Code Browser, Code Explorer and Pro

15、ject Browser使用的標識符引用信息。如果Reference Info和Definitions Only 都被選中,則編譯器將記錄標識符定義位置信息。如果僅選中了 Reference Info,表示編譯器不僅記錄標識符定義的位置,同時將記錄標識符被引用的信息。如果不選中Debug Information 和 Local Symbols 選項,僅選中該選項將不起作用。Assertions:產(chǎn)生斷言的調(diào)試代碼。Use Debug DCUs:使用連接的Dcu文件作為調(diào)試路徑。必須在【Tools】|【Debugger Options】|【General】頁中指定調(diào)試文件的路徑。一般不選中該項。

16、 (3)Messages 區(qū)域Show Hints:使編譯器產(chǎn)生提示信息。例如檢測在過程或函數(shù)中聲明了但一直沒有使用的變量信息,或者無效的引用信息等。Show Warnings:使編譯器產(chǎn)生警告信息。3編譯程序發(fā)現(xiàn)編譯錯誤在調(diào)試之前,必須先編譯通過??梢赃x擇【Project】|【Complie】 <工程名>可以對工程進行編譯,檢測編譯錯誤。也可以按【Ctrl+F9】執(zhí)行同樣的操作。默認情況下,如果有錯誤或是警告和提示信息則顯示在Message列表框中。6.4.2 控制程序的執(zhí)行 Delphi程序的調(diào)試命令都集中在RUN菜單下??梢匀N方式進行調(diào)試:【Step Over(F8)】單步

17、執(zhí)行調(diào)試、【Trace Into(F7)】跟蹤調(diào)試或使用、【Run To Cursor(F4)】運行到光標所在處。Step Over一次執(zhí)行一行語句,碰到調(diào)用過程時也是一步就執(zhí)行過去,不會跟蹤到過程的內(nèi)部代碼中去逐行執(zhí)行,Trace Into則是在碰到過程或函數(shù)時跟蹤到它們的內(nèi)部,可以對其內(nèi)部代碼進行調(diào)試。 Run To Cursor則從當前運行位置直接運行到光標所在的位置如果光標所在的位置和當前運行位置處在不同的事件代碼中,則不能直接運行到光標處,只有當發(fā)生了該事件才可以繼續(xù)執(zhí)行。6.4.3 使用斷點 斷點(BreakPoint)就是使程序運行中斷的點。在一個應(yīng)用程序總可以設(shè)置多處斷點,當程

18、序運行到斷點處,會暫停執(zhí)行,等待進一步的命令。 1斷點的設(shè)置(1)單擊選定代碼行左邊的空白。(2)在光標所在的行處按【F5】。(3)使用【Run】|【Add Breadpoint】|【source breakpoint】 打開斷點編輯對話框,在Line Number處輸入需要加斷點的行號即可。斷點必須位于可執(zhí)行代碼行上,另外,斷點既可以在設(shè)計狀態(tài)下設(shè)置也可以在運行調(diào)試狀態(tài)下設(shè)置。 一個有效(Enable)的斷點默認的情況下該代碼行顯示為紅色,正確的斷點小圓點中是一個對號。2斷點的刪除和設(shè)置刪除一個斷點,只要再次在已經(jīng)設(shè)置為斷點的代碼行單擊其左側(cè)的空白處或按【F5】鍵就可以刪除斷點。 如果一個應(yīng)

19、用程序許多位置都設(shè)置了斷點,則可以使用斷點列表框來管理所有的斷點。使用【View】|【Debug】|【breakpoints】打開斷點列表框,列表框?qū)⒘谐鰬?yīng)用程序中設(shè)置的所有斷點,無效(Disable)的斷點前面的標志為灰色。在列表窗口中單擊右鍵,將顯示一個斷點設(shè)置快捷菜單,使用該快捷菜單可以實現(xiàn)對斷點的添加、刪除、使有效以及無效等操作。(1)利用斷點列表窗口可以快速找到斷點在源代碼中的位置(2)斷點功能的失效和恢復(fù)在斷點列表窗口單擊右鍵,在快捷菜單中取消對Enable的選擇或選擇【breakpoints】|【Disable All BreakPoints】項可以使當前選中斷點或所有斷點失去功

20、能??旖莶藛沃械摹綞nable BreakPoint】和【Enable All BreakPoint】可以使相應(yīng)斷點恢復(fù)功能。同樣快捷菜單中的【Delete BreakPoint】和【Delete All BreakPoint】 可以刪除當前選中斷點或所有斷點。3修改斷點屬性在斷點列表窗口選擇斷點后單擊右鍵,在彈出的快捷菜單中選擇Properties,則打開斷點編輯對話框,用于顯示和修改斷點屬性。 也可以使用【Run】|【Add Breadpoint】|【source breakpoint】打開該對話框。利用該對話框可以改變斷點的位置,設(shè)置斷點條件。斷點條件包括兩種:布爾表示式和通過次數(shù)。Co

21、ndition編輯框用于設(shè)置布爾表達式條件。如果表達式值為真(或非零)則程序運行在斷點處中止;否則調(diào)試器將忽略該斷點。Pass Count編輯框用于設(shè)置通過次數(shù)條件,即只有當程序運行在該斷點處通過設(shè)定次數(shù)時程序運行才在該斷點處中止。同時設(shè)置時,Pass Count是指滿足條件的通過次數(shù)。6.4.4 監(jiān)視數(shù)據(jù)的值 1監(jiān)視表達式選擇【View】|【Debug Windows】|【W(wǎng)atches】可以打開監(jiān)視列表窗口Watch List。在該窗口中單擊鼠標右鍵,在彈出的快捷菜單中選擇Add Watch打開監(jiān)視屬性對話框,可以添加新的變量或表達式。也可以使用【Run】|【Add Watch】打開監(jiān)視屬

22、性對話框。在Expression右邊的編輯框中添加要監(jiān)測的變量或表達式,同時設(shè)置其屬性。當該表達式代表一個數(shù)據(jù)元素時,可以在Repeat count中指定其重復(fù)次數(shù)。如果要監(jiān)測的是一個數(shù)組的值,可以使用Repeat count指定數(shù)組元素的下標。 2計算/修改表達式選擇【Run】|【Evaluate/Modify】可打開計算/修改對話框。 當單擊Evaluate按鈕時,Expression編輯框中表達式的值顯示在Result域中。Expression中可以輸入或選擇任何合法的表達式(包括對象的屬性),但不能包括;(1)包含有當前執(zhí)行點不能引用的局部或靜態(tài)變量的表達式;(2)函數(shù)或過程調(diào)用。Expression中的表達式可以帶特定的格式字符用于規(guī)定其顯示格式。 其表示語法格式為:變量名,格式字符串。 可使用的格式字符及其

溫馨提示

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

最新文檔

評論

0/150

提交評論