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

下載本文檔

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

文檔簡(jiǎn)介

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

2、建的異常類,程序員自定義的異常類。異?;惣捌鋵傩院椭饕椒ǎ涸贒elphi中,所有異常的基類是Exception類。所有其他異常類都是由該類派生而來。 1 exception屬性該類有兩個(gè)基本屬性:HelpContext和Message。(1)Exception.HelpContext屬性 該屬性的定義如下: § Type ThelpContext= -MaxLongint.MaxLongint;§ Property HelpContext:ThelpContext;HelpContext是ThelpContext類的一個(gè)實(shí)例,它提供了與異常對(duì)象聯(lián)系在一起的上下文相關(guān)幫助

3、信息的序列號(hào)。該序列號(hào)決定當(dāng)發(fā)生異常時(shí)用戶按F1鍵顯示的一個(gè)異常錯(cuò)誤的幫助信息。 (2)Exception.Message屬性該屬性的定義如下: property Message: string 該屬性存儲(chǔ)異常發(fā)生時(shí)的錯(cuò)誤信息??梢酝ㄟ^該屬性在提示錯(cuò)誤對(duì)話框中顯示錯(cuò)誤信息字符串。2exception方法(1)Exception.Create方法該方法的定義形式為: Constructor Create(Const Msg: String);該方法用來產(chǎn)生一個(gè)帶有一條簡(jiǎn)單提示信息的對(duì)話框,對(duì)話框中的提示內(nèi)容由Msg提供(2)Exception.CreateFmt方法該方法的定義格式如下: Con

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

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

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

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

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

9、轉(zhuǎn)此區(qū)域,轉(zhuǎn)而執(zhí)行“FinallyEnd”區(qū)的所有語(yǔ)句。 例: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)自動(dòng)觸發(fā)以及程序員使用raise指令去觸發(fā)的異常,故在本區(qū)可根據(jù)狀況條件來使用Raise指令。然而在本區(qū)使用raise指令,或

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論