微計(jì)算機(jī)技術(shù)第九章調(diào)試與錯(cuò)誤分類_第1頁(yè)
微計(jì)算機(jī)技術(shù)第九章調(diào)試與錯(cuò)誤分類_第2頁(yè)
微計(jì)算機(jī)技術(shù)第九章調(diào)試與錯(cuò)誤分類_第3頁(yè)
微計(jì)算機(jī)技術(shù)第九章調(diào)試與錯(cuò)誤分類_第4頁(yè)
微計(jì)算機(jī)技術(shù)第九章調(diào)試與錯(cuò)誤分類_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

新教材第9章

調(diào)試與錯(cuò)誤分類

1

9.1程序錯(cuò)誤分類

9.1.1編譯錯(cuò)誤

編譯錯(cuò)誤多數(shù)是因?yàn)椴徽_的代碼產(chǎn)生的,

即在編寫程序時(shí)寫了有錯(cuò)誤的語(yǔ)法代碼,從而

導(dǎo)致VB編譯器無(wú)法正確解釋源代碼而產(chǎn)生錯(cuò)誤,

一般包括關(guān)鍵字拼寫錯(cuò)誤、標(biāo)點(diǎn)符號(hào)遺漏,語(yǔ)

句搭配不當(dāng)?shù)?。比如以下代碼,將Dim錯(cuò)誤地

寫成了Dimm,就會(huì)產(chǎn)生編譯錯(cuò)誤。

PrivateSubFromLoad

DimMystrAsString

DimmIAsInteger

EndSub

2

3

9.1.2實(shí)時(shí)錯(cuò)誤

實(shí)時(shí)錯(cuò)誤是指應(yīng)用程序出現(xiàn)期間,-

條語(yǔ)句試圖執(zhí)行一條不可能執(zhí)行的操作而

生的錯(cuò)誤。例如下面的語(yǔ)句:

PrivateSubForm_Load0

x=0:y=100

Printy/x

EndSub

這段語(yǔ)句在語(yǔ)法上是正確的,VB編譯

器不能檢測(cè)出錯(cuò)誤,因此不會(huì)產(chǎn)生編譯錯(cuò)

誤。但等到實(shí)際運(yùn)行時(shí),當(dāng)除數(shù)Number等

于0時(shí),就會(huì)出現(xiàn)實(shí)時(shí)錯(cuò)誤。

MicrosoftVisualBasic

實(shí)時(shí)錯(cuò)誤’11:

除數(shù)為零

J結(jié)束⑥|惆色量|幫助皿

5

9.1.3邏輯錯(cuò)誤

邏輯錯(cuò)誤是指程序的運(yùn)行結(jié)果和程

序員是設(shè)想有出入時(shí)產(chǎn)生的錯(cuò)誤。這類

錯(cuò)誤并不導(dǎo)致程序在編譯期間出現(xiàn)錯(cuò)誤,

較難發(fā)現(xiàn),驗(yàn)證程序是否存在邏輯錯(cuò)誤

的唯一方法就是將運(yùn)行結(jié)果與設(shè)計(jì)方案

進(jìn)行對(duì)照比較。比如你想用以下格式顯

示一段詩(shī):

6

鄙夜思2£J

床前明月光,疑是地上霜;

舉頭望明月,低頭思故鄉(xiāng)。

:確定……[

7

程序員用下列語(yǔ)句實(shí)現(xiàn)上述設(shè)計(jì):

PrivateSubForm_Load()

MsgBox〃床前明月光,疑是地上霜;〃+_

〃舉頭望明月,低頭思故鄉(xiāng)?!ǎ瑅bOKOnly,

〃靜夜思〃\

EndSub結(jié)果出現(xiàn)邏輯錯(cuò)誤。

群夜思

床前明月光,疑是地上霜;舉頭望明月,低頭思故鄉(xiāng)

8

正確的語(yǔ)句應(yīng)為:

PrivateSubForm_Load()

MsgBox”床前明月光,疑是地上霜;“+Chr(13)

+_

〃舉頭望明月,低頭思故鄉(xiāng)。〃,vbOKOnly,_

〃靜夜思〃

EndSub

注意:邏輯錯(cuò)誤通常不會(huì)產(chǎn)生消息提示。

9

P226習(xí)題一、問(wèn)答題

5.VB程序錯(cuò)誤大體可分為哪幾種,它們的含義

是什么?

答:VB程序錯(cuò)誤大體分為三種:編譯錯(cuò)誤、實(shí)

時(shí)錯(cuò)誤和語(yǔ)法錯(cuò)誤。

編譯錯(cuò)誤是在編寫程序時(shí)書(shū)寫了有錯(cuò)誤A語(yǔ)法的

代碼,導(dǎo)致VB編譯器無(wú)法正確解釋源代碼而

產(chǎn)生的錯(cuò)誤,也稱語(yǔ)法錯(cuò)誤。實(shí)時(shí)錯(cuò)誤是指在

運(yùn)行期間,一跳語(yǔ)句試圖執(zhí)行一條不可能執(zhí)行

的操作而產(chǎn)生的錯(cuò)誤,也稱運(yùn)行時(shí)錯(cuò)誤。邏輯

錯(cuò)誤是指程序的運(yùn)行結(jié)果和程序員的設(shè)想有出

入時(shí)產(chǎn)生的錯(cuò)誤。

10

9.2程序調(diào)試方法

VB本身不能改正錯(cuò)誤,但它提供了

一些調(diào)試工具輔助程序員查找,分析錯(cuò)

誤。有了調(diào)試工具,程序員就能夠深入

到應(yīng)用程序內(nèi)部,徹底地了解發(fā)生了什

么,以及為什么會(huì)發(fā)生。

11

9.2.1用編譯器提示錯(cuò)誤

VB集成環(huán)境提供了、《自動(dòng)語(yǔ)法檢測(cè)”功

能,可以在程序員編寫程序時(shí)自動(dòng)檢測(cè)和提

示語(yǔ)法錯(cuò)誤。如果使用了該選項(xiàng),那么程序

員每書(shū)寫完一行語(yǔ)句并鍵入回車符時(shí),VB編

譯器就會(huì)解釋該行語(yǔ)句。當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí),就

會(huì)加亮顯示出現(xiàn)語(yǔ)法錯(cuò)誤的語(yǔ)句并顯示一個(gè)

消息框來(lái)解釋錯(cuò)誤原因并提供幫助,以方便

程序員更正錯(cuò)誤。

在“工具”菜單上,單擊“選項(xiàng)”子菜

單,可以設(shè)置或消除“自動(dòng)語(yǔ)法檢測(cè)”選項(xiàng)。

12

選項(xiàng)兇

編輯器I編輯器格式I通用I可連接的I環(huán)境I高級(jí)I

「代碼逡置_________

廠阻動(dòng)語(yǔ)法檢測(cè)i?17自動(dòng)縮進(jìn)Q)

變量聲麗而

Tab寬度(X):R

17自動(dòng)列出成員?

171自動(dòng)顯示快速信息@)

17:自動(dòng)顯示數(shù)據(jù)提示6)

?窗口設(shè)置----------------

P編輯時(shí)可拖放文本也)

P缺省為整個(gè)模塊查閱?)

17過(guò)程分隔符(D

確定|取消|幫助|

P226習(xí)題二、程序設(shè)計(jì)題

1.程序改錯(cuò)。以前面學(xué)到的冒泡排序算法為例,開(kāi)發(fā)以下程

序,請(qǐng)上機(jī)練習(xí)排除其中的錯(cuò)誤°

唆工程1-Forml(Code)匚叵區(qū)

|Coa>andl1Click~^]

PrivateSubCommandl_Click()~

DimA(1To20)AsInteger

Dimc,jAsInteger

DimTAsString

Fori=1To20

A(i)=Int(Rnd*100)

Nexti

Forc=1To20

Forj=c+lTo20

IfA(c)>A(i)Then

T=A(j)

A(j)=A(c)

A(j)=T

EndIf

Next__

Next

EndSub▼[

14

P226習(xí)題二、程序設(shè)計(jì)題

1.程序調(diào)試。

(1)運(yùn)行程序,結(jié)果如下:

20個(gè)隨機(jī)整數(shù)排序:

41

86

79

37沒(méi)有實(shí)現(xiàn)冒泡

96

87排序。

5

94

36

.;.產(chǎn)..生.2.0不商機(jī)藪

15

P226習(xí)題▲、程序設(shè)計(jì)題

1.程序調(diào)試。

(2)分析錯(cuò)誤原因:

Forc=1To20

Forj=c+1To20

IfA(c)>A(j)Then,若前者大于后者

暫存小數(shù)、

T=A0)

A(j)=A(c),后者暫存大數(shù)

A(j)=T5匕語(yǔ)句應(yīng)改為A(c)=T

EndIf

Next

Next

16

P226習(xí)題二、程序設(shè)計(jì)題

1.程序調(diào)試。

(3)修改后的程序:

用工程1-Forml(Code)

CouandlClick

Commandl_Click()

o20)AsInteger

AsInteger

String

Int(Rnd*100)

,A(c)>A(j)Then

T=A(j)

A(j)=A(c)

AAC)

■ri=1ToUBound(A)

Listl.AdditemA(i)

Sub

17

P226習(xí)題二、程序設(shè)計(jì)題

1.程序調(diào)試。

(4)程序修改后運(yùn)行結(jié)果:

?Forml

20個(gè)隨機(jī)整數(shù)排序;

36

37

41

53

:產(chǎn)生20不蔭加函n

18

9.2.2使用調(diào)試工具來(lái)發(fā)現(xiàn)和改正錯(cuò)誤

利用VB提供的調(diào)試工具,除了可以完

成斷點(diǎn)設(shè)置、中斷表達(dá)式、監(jiān)視表達(dá)式、單

步執(zhí)行、顯示變量和屬性值外,上能夠在實(shí)

現(xiàn)應(yīng)用程序處于中斷模式時(shí)進(jìn)行編譯、設(shè)置

下一條執(zhí)行語(yǔ)句,進(jìn)行過(guò)程測(cè)試等功能。

“調(diào)試工具”菜單如下:

19

調(diào)試運(yùn)行(B)查詢(6圖表①XI

■--***—■**-J-?,?'P.

隆逐語(yǔ)句①F8

J1逐過(guò)程(Q)5hift+F8

4M出。即+升枇十曲

運(yùn)行到光標(biāo)處因QMF8

■.,--*'.***!.??t

添加蝴I@,凝||

編輯強(qiáng)御?sCtrlfW

時(shí)快速監(jiān)視(6…Shift+F9

心切換斷點(diǎn)⑴F9

清除所有斷點(diǎn)(0Ctrl+Shift+F9

4設(shè)置T一條語(yǔ)句網(wǎng)0H+F9

%即TT-袤語(yǔ)句處

調(diào)試菜單各功能項(xiàng)的主要含義

1,逐語(yǔ)句:每按一次F8鍵,應(yīng)用程序就執(zhí)

行一條語(yǔ)句,因此也稱單步執(zhí)行。是一

種常見(jiàn)的調(diào)試方法。如果程序調(diào)用了另

一個(gè)過(guò)程,逐語(yǔ)句也會(huì)執(zhí)行該過(guò)程中的

每一行。

2.逐過(guò)程:與逐語(yǔ)句執(zhí)行過(guò)程相似,但如

果程序調(diào)用了另一個(gè)過(guò)程,逐過(guò)程不會(huì)

進(jìn)入該過(guò)程。

3.跳出:執(zhí)行當(dāng)前過(guò)程的其它部分,并在

調(diào)用該過(guò)程的下一行語(yǔ)句處中斷執(zhí)行。

21

調(diào)試菜單各功能項(xiàng)的主要含義

4.運(yùn)行到光標(biāo)處:執(zhí)行程序,當(dāng)下一條語(yǔ)

句為光標(biāo)所在語(yǔ)句時(shí),中斷執(zhí)行。

5.添加監(jiān)視:添加對(duì)變量和表達(dá)式的跟蹤,

以便在程序運(yùn)行時(shí),隨時(shí)觀察變量和表

達(dá)式的值。

6.編輯監(jiān)視:在程序運(yùn)行時(shí),動(dòng)態(tài)改變所

要監(jiān)視的變量或表達(dá)式。

7.快速監(jiān)視:主要用于快速查看光標(biāo)后面

的變量的值。

22

調(diào)試菜單各功能項(xiàng)的主要含義

8,切除斷點(diǎn):用于設(shè)置或切除斷點(diǎn)

9.清除所有斷點(diǎn):用于清除程序中設(shè)置的

所有斷點(diǎn)。

10.設(shè)置下一條語(yǔ)句:程序員可以按自己的

思路改變程序的執(zhí)行流程。

11.顯示下一條語(yǔ)句:快速切換并切換到下

一條執(zhí)行的語(yǔ)句處,當(dāng)代碼量較大時(shí),

該功能很有用。

23

9.2.3常用的調(diào)試技巧

如果程序的運(yùn)行結(jié)果和預(yù)想的不一樣,

通??稍诰庉嬈髦袨g覽代碼,查找并直

接修改可能產(chǎn)生問(wèn)題的代碼。但多數(shù)情

況下,即使是非常有經(jīng)驗(yàn)的程序員也很

難一眼就找處錯(cuò)誤,此時(shí)常用的方法就

是在程序運(yùn)行的關(guān)鍵路徑上設(shè)置一系列

斷點(diǎn),并重新啟動(dòng)應(yīng)用程序。

24

可供參考的調(diào)試技巧:

1.事先做好備份

避免在程序調(diào)試過(guò)程中,被意外地修改、覆蓋或

刪除必要的代碼部分。

2.分離受懷疑的程序

對(duì)于那些代碼規(guī)模較大,窗口眾多的程序而言,

如果能將錯(cuò)誤的范圍定位于某個(gè)窗體或某段代碼,

則可以使用分離程序的調(diào)試方法?;舅悸肥钦?/p>

出錯(cuò)誤的代碼行(塊)或窗體,選擇這些代碼并

將其復(fù)制到一個(gè)新的工程中,最后運(yùn)行新工程,

看一看是否還會(huì)出現(xiàn)同樣的錯(cuò)誤。這樣就可以盡

可能地排除程序其它部分的干擾,提高調(diào)試效率。

25

可供參考的調(diào)試技巧:

3.縮小搜索范圍

如果有可能的話,可刪除工程中任何第三方控件

和自定義控件,或者看來(lái)與問(wèn)題無(wú)關(guān)的代碼,逐

步縮小搜索范圍?;蛘卟捎孟喾吹牟呗?,先調(diào)試

某一段代碼或窗體,再像搭積木似的逐步擴(kuò)大調(diào)

試范圍。

2.使用MsgBox語(yǔ)句

如果懷疑程序的錯(cuò)誤是由于執(zhí)行路徑或者變量的

值不正確等原因造成的,除了采用設(shè)置斷點(diǎn)的方

法進(jìn)行調(diào)試以外,還可以借助于MsgBox語(yǔ)句。即

在程序運(yùn)行的關(guān)鍵點(diǎn)上插入一系列的語(yǔ)句,用來(lái)

展示程序的運(yùn)行路徑和這樣變量的值?!?/p>

使用MsgBox語(yǔ)句的調(diào)試技巧示例

設(shè)計(jì)一個(gè)將小寫金額轉(zhuǎn)換為大寫金額的簡(jiǎn)化

轉(zhuǎn)換程序,將輸入的用數(shù)字表示的金額轉(zhuǎn)換為

有漢字表示的大寫金額。

PrivateSubform_cIick()

'本程序?qū)⒏鶕?jù)MyNumber的值返回大寫數(shù)值

DimMstr(9)AsString

DimMyNumberAsString

DimLstrAsString

Dimi,jAsInteger

DimConvertAsString

27

Mstr(0)=“零":Mstr⑴二“壹”:Mstr(2)二“貳”

Mstr(3)="叁":Mstr(4)="肆":Mstr(5)="伍"

Mstr(6)="陸":Mstr⑺="柒":Mstr(8)="捌

〃Mstr(9)=〃玖〃

MUnit二〃元拾佰仟萬(wàn)拾佰仟億拾佰仟〃

MyNumber=InputBox(“請(qǐng)輸入一個(gè)數(shù)字",_

〃輸入數(shù)字〃)

28

Fori=1ToLen(MyNumber)

’從高位到低位逐位取輸入數(shù)字

j=Vai(Mid(MyNumber,i,1))

'用MsgBox提示當(dāng)前的數(shù)字

MsgBox〃當(dāng)前的數(shù)字是:〃+Str(j)

’取當(dāng)前數(shù)字對(duì)應(yīng)單位左邊的字串

Lstr=Mid(MyNumber,i)

’從高位到低位逐位轉(zhuǎn)換成漢語(yǔ)大寫字符

Convert=Gonvert+Mstr(j)+Mid(MUnit,Len(Lstr),1)

'用MsgBox提示從高位到低位轉(zhuǎn)換的結(jié)果

MsgBox”轉(zhuǎn)換后的字符串是:〃+Convert

Nexti

EndSub

29

P226習(xí)題一、問(wèn)答題

3.簡(jiǎn)述常用的程序調(diào)試蔻巧。

答:

1)事先做好備份;

2)分離受懷疑的程序;

3)縮小搜索范圍;

4)使用MsgBox語(yǔ)句。

30

P226習(xí)題一、問(wèn)答題

4.簡(jiǎn)要說(shuō)明VB程序調(diào)試的主要方法和工具。

答:VB程序調(diào)試的主要方法:由編導(dǎo)器提示錯(cuò)誤;

使用調(diào)試工具來(lái)發(fā)現(xiàn)和改正錯(cuò)誤;太藥常用的調(diào)

試技巧,如事先做好備份,分離受懷肩的程序?

縮小搜索范圍,使用MsgBox語(yǔ)句等。\

主要工具:“調(diào)試”菜單下的“逐語(yǔ)句”、“逐過(guò)

程”、“跳出”、“運(yùn)行到光標(biāo)處”、“添力口監(jiān)

視”、“快速監(jiān)視”、“切換斷點(diǎn)”等子菜單項(xiàng)。

31

9.3錯(cuò)誤捕獲及處理方法

1.沒(méi)有錯(cuò)誤捕獲及處理過(guò)程的程序執(zhí)行

效果

力寅示charlO.2.1、

正確情況下。程序不會(huì)出現(xiàn)任何錯(cuò)誤,單

如果指定的驅(qū)動(dòng)器是軟盤驅(qū)動(dòng)器時(shí)。則只

有驅(qū)動(dòng)器內(nèi)有磁盤且驅(qū)動(dòng)器關(guān)閉時(shí),該程

序才能正確執(zhí)行,否則產(chǎn)生“設(shè)備不可用

之類的錯(cuò)誤使程序終止執(zhí)行。

32

MicrosoftVisualBasic

實(shí)時(shí)錯(cuò)誤‘68':

設(shè)備不可即

I結(jié)束束?明[1^1幫帆)I

33

2.加入錯(cuò)誤捕獲及處理過(guò)程的程序執(zhí)行效果

為了防止上述情況的發(fā)生、就需要在該

程序中加入錯(cuò)誤捕獲和處理程序,'提高程序

的可靠性。這樣當(dāng)出現(xiàn)任何異常時(shí),程序會(huì)

向用戶提示,不再因此而異常退出。,

演示char9.3.1

34

程序代碼設(shè)計(jì)

PrivateSubForm_Load()

,設(shè)置控件的有效狀態(tài)

Drivel.Enabled=True

Dirl.Enabled=True

Filel.Enabled=True

,設(shè)置過(guò)濾器

Filel.Pattern=''*.exe''

,設(shè)置控件的初始驅(qū)動(dòng)器

Drivel.Drive=nc:\n

EndSub

35

程序代碼設(shè)計(jì)

SubDirl_Change()

,改變目錄

Filel.Path=Dir1.Path

EndSub

36

程序代碼設(shè)計(jì)

PrivateSubDrivel_Change()

OnErrorGoToCheckError

,改變驅(qū)動(dòng)器

Dirl.Path=Drivel.Drive

ExitSub

CheckError:

錯(cuò)誤代碼處理

FileExixts=False

Mystr=“發(fā)生了以下錯(cuò)誤:"+Err.Description

Mystr=Mystr+vbCr+''錯(cuò)誤號(hào)是:''+Str(Err.Number)

Mystr=Mystr+vbCr+“你輸入的文件路徑:”+Dirl.Path

MsgBoxMystr,vbQuestion,“錯(cuò)誤捕獲與處理演示”

EndSub

37

程序代碼設(shè)計(jì)

PrivateSubFilel_Click()

IfFilel.FileName<>Then

FileExists=True

MsgBox「文件名為“"+Filel.FileName+"的路徑為:”

+Filel.Path++Filel.FileName)

Else

FileExists=False

MsgBox「找不到文件名為“"+Filel.FileName+"的文件!

,')

EndIf

EndSub38

9.3.2設(shè)計(jì)錯(cuò)誤處理程序的三個(gè)步驟

1.捕獲錯(cuò)誤,并強(qiáng)制程序跳轉(zhuǎn)

即在發(fā)生錯(cuò)誤時(shí),捕獲錯(cuò)誤將告知應(yīng)用程序轉(zhuǎn)

向哪段代碼進(jìn)行錯(cuò)誤處理。VB語(yǔ)編嚶??刹捎肙n

ErrorGoTo語(yǔ)句啟用錯(cuò)誤捕獲機(jī)制。如果出現(xiàn)運(yùn)

行時(shí)錯(cuò)誤,即可借助OnErrorGoTo語(yǔ)句,強(qiáng)制程

序跳轉(zhuǎn)到指定的標(biāo)記處。需要注意的是,On

ErrorGoTo語(yǔ)句只能在一個(gè)過(guò)程內(nèi)部跳轉(zhuǎn),并且

在一個(gè)過(guò)程中一次只能啟用一個(gè)錯(cuò)誤捕獲。如果要

使錯(cuò)誤捕獲失效,因可使用OnErrorGoTo0之類

的語(yǔ)句。

39

9.3.2設(shè)計(jì)錯(cuò)誤處理程序的三個(gè)步驟

2.編寫錯(cuò)誤處理程序

編寫錯(cuò)誤處理程序的第一步是添加一個(gè)行標(biāo)識(shí)

符,比如"CheckError",以標(biāo)志錯(cuò)誤處理程序的

開(kāi)始。行標(biāo)識(shí)符的名稱最好具有良好的可讀性,并

且后面必須緊跟一個(gè)冒號(hào)。常規(guī)錯(cuò)誤處理套序通常

放在過(guò)程的結(jié)束處,后面緊跟Exit或Exit

Function的行標(biāo)識(shí)符。這樣在沒(méi)有錯(cuò)誤發(fā)生時(shí),過(guò)

程就不會(huì)執(zhí)行錯(cuò)誤處理程序了。

40

9.3.2設(shè)計(jì)錯(cuò)誤處理程序的三個(gè)步驟

通常的格式為:I

Sub程序名()

OnErrorGoTo行標(biāo)識(shí)符

[正常的程序代碼]

ExitSub5正常退出程序

行標(biāo)識(shí)符:

錯(cuò)誤處理程序\

EndSub

41

9.3.2設(shè)計(jì)錯(cuò)誤處理程序的三個(gè)步驟

3.退出錯(cuò)誤處理程序

通常情況下,只有當(dāng)錯(cuò)誤處理程序位于過(guò)程中

間位置時(shí),才需要用到專門的錯(cuò)誤處理程序退出語(yǔ)

句。一般可以用Resume或ResumeNext語(yǔ)句退出錯(cuò)

誤處理程序。Resume語(yǔ)句會(huì)繼續(xù)執(zhí)行引發(fā)錯(cuò)誤的那

句代碼,而ResumeNext語(yǔ)句則會(huì)跳過(guò)該語(yǔ)句,執(zhí)

行引發(fā)錯(cuò)誤代碼的下一句語(yǔ)句。

42

P226習(xí)題一、問(wèn)答題

2.請(qǐng)簡(jiǎn)要設(shè)計(jì)錯(cuò)誤處理程序的。個(gè)步驟。

答:

1)捕獲錯(cuò)誤,并強(qiáng)制程序跳轉(zhuǎn)

2)編寫錯(cuò)誤處理程序'

3)退出錯(cuò)誤處理程序

43

9.3.3Err對(duì)象

Err對(duì)象是個(gè)運(yùn)行期對(duì)象,它包含了有

關(guān)最新錯(cuò)誤的信息。當(dāng)運(yùn)行中遇到了一個(gè)錯(cuò)

誤時(shí),或者當(dāng)用戶使用Err對(duì)MjUise方法

故意引發(fā)一個(gè)錯(cuò)誤時(shí),它形成了Error對(duì)象

的屬性。當(dāng)遇到OnEiror語(yǔ)句時(shí),或使用

ExitSub,ExitFunction語(yǔ)句退出一個(gè)過(guò)程

后,Err對(duì)象的屬性值將被清除。若要強(qiáng)制

清除Err對(duì)象的屬性可以調(diào)用它的Clear方法。

44

Err對(duì)象的主要屬性

屬性說(shuō)明

Number用于標(biāo)識(shí)該錯(cuò)誤的專用號(hào)g,數(shù)值型

Sourse當(dāng)前項(xiàng)目的名字,字符型\

Description錯(cuò)誤描述,如果某個(gè)錯(cuò)誤沒(méi)有具體的錯(cuò)

誤描述,本屬性一般會(huì)指明“應(yīng)用程序

定義錯(cuò)誤或?qū)ο蠖x錯(cuò)誤”,字符型

LastDLLError在32位的Windows操作系統(tǒng)上,上次調(diào)

用動(dòng)態(tài)鏈接庫(kù)(DLL)D的系統(tǒng)錯(cuò)誤代碼,

數(shù)值型

45

9.3.4OnError語(yǔ)句

OnError命令有三種形式:

1.OnErrorResumeNext語(yǔ)句:當(dāng)發(fā)生錯(cuò)

誤時(shí),VB程序?qū)⒑雎砸l(fā)錯(cuò)誤的語(yǔ)句,并

繼續(xù)執(zhí)行下一條語(yǔ)句。

2.OnErrorGoTo行標(biāo)識(shí)符語(yǔ)句:當(dāng)發(fā)生錯(cuò)

誤時(shí),使用該語(yǔ)句強(qiáng)制改變程序的執(zhí)行方

向。

3.OnErrorGoTo0語(yǔ)句:用于關(guān)閉錯(cuò)誤捕

獲機(jī)制。

46

P226習(xí)題一、問(wèn)答題

6.請(qǐng)說(shuō)明OnErrorGoTo與OnErrorResume

Next的區(qū)別。

答:OnErrorGoTo行標(biāo)識(shí)符語(yǔ)句:當(dāng)發(fā)生

錯(cuò)誤時(shí),使用該語(yǔ)句強(qiáng)制改變程序的執(zhí)行

方向。而OnErrorResumeNext語(yǔ)句:當(dāng)

發(fā)生錯(cuò)誤時(shí),VB程序?qū)⒑雎砸l(fā)錯(cuò)誤的語(yǔ)

句,并繼續(xù)執(zhí)行下一條語(yǔ)句。

47

P226習(xí)題二、程序設(shè)計(jì)題

2.錯(cuò)誤處理。按下圖設(shè)計(jì)一除注程取請(qǐng)使用OnError

GoTo語(yǔ)句對(duì)除法程序進(jìn)行處理,當(dāng)出現(xiàn)除數(shù)為0或其他

異常情況時(shí),使用MsgBox提示錯(cuò)誤信息。

除數(shù):

被除數(shù):錯(cuò)誤提示

7姿冥也程上

結(jié)果:?/錯(cuò)誤號(hào)是:

運(yùn)算清除

48

P226習(xí)題二、程序設(shè)計(jì)題

程序代碼:

摩工程1-Forml(Code)

CoB>and2|Click

PrivateSubComiRandl_Click()被

OnErrorGoToErrLB一

Text3.Text=Trim(Str(Vai(Textl.Text)/Vai(Text2.Text)))

ExitSub

ErrLB:

DimstrMsgAsString

strMsg=“運(yùn)算過(guò)程出現(xiàn)了如下錯(cuò)誤:"+vbCr_

strMsg=strMsg+”錯(cuò)誤號(hào)懸:"+Trim(Str(Err.Number))+vbCr

strMsg=strMsg+”昔誤描述是:"+Err.Descrirrtion

MsgBoxstrMsg,vbQuestion+vbOKOnly,“錯(cuò)誤提示“

Text2.SetFocus

曲________________________________________________________________▼|

49

9.3.5如何避免錯(cuò)誤

盡管VB提供了多種錯(cuò)誤晟及卷理方法,但是調(diào)試畢竟是

件費(fèi)時(shí)費(fèi)事是工作,因此最好病在逑序中盡量避免錯(cuò)誤。

避免應(yīng)用程序中產(chǎn)生錯(cuò)誤的若干方法:

1.事先精心設(shè)計(jì)應(yīng)用程序,描述清楚相關(guān)事件以及代碼響應(yīng)

每一事件的方法,為每一事件過(guò)程和每個(gè)普通過(guò)程都指定

一個(gè)特點(diǎn)的、明確的目標(biāo)。

2.多加注釋。如果用注釋說(shuō)明每個(gè)過(guò)程的目的,在以后分析

代碼時(shí),能更深入地理解這些代碼。

3.對(duì)過(guò)程中用到的每個(gè)變量或?qū)ο蠖紤?yīng)該在過(guò)程開(kāi)始部分加

以定義。

4.在應(yīng)用程序中對(duì)變量和對(duì)象提出一種前后一致的命名方案

50

P226習(xí)題一、問(wèn)答題

1.請(qǐng)思考如何避免錯(cuò)誤。

答:

1)事先精心設(shè)計(jì)應(yīng)用程序,描述清楚才哀青件以及代碼響應(yīng)

每一事件的方法,為每一事件過(guò)程和每個(gè)普通過(guò)程都指定

一個(gè)特點(diǎn)的、明確的目標(biāo)。

2)多加注釋。如果用注釋說(shuō)明每個(gè)過(guò)程的目的,在以后分

析代碼時(shí),能更深入地理解這些代碼。

3)對(duì)過(guò)程中用到的每個(gè)變量或?qū)ο蠖紤?yīng)該在過(guò)程開(kāi)始部分加

以定義。

4)在應(yīng)用程序中對(duì)變量和對(duì)象提出一種前后一致的命名方案。

51

實(shí)驗(yàn)9簡(jiǎn)單程序調(diào)試及錯(cuò)誤處理

一、程序調(diào)試實(shí)驗(yàn)

1.實(shí)驗(yàn)要求:開(kāi)發(fā)一個(gè)排序程序,首先要求用戶在Textl中

輸入一個(gè)整數(shù),點(diǎn)擊“添加到初始系列中”后將該數(shù)添加

到“初始系列"Listl中,如此反復(fù)多次,再點(diǎn)擊“排序”

茗鈕,在List2中顯示排序結(jié)果。期望的運(yùn)行界面如圖所

Zj\O

52

實(shí)驗(yàn)9簡(jiǎn)單程序調(diào)試及錯(cuò)誤處理

一、程序調(diào)試實(shí)驗(yàn)

2.實(shí)驗(yàn)步驟

第1步:編寫程序(在設(shè)計(jì)界面的基礎(chǔ)上)

,排序程序日回區(qū)

請(qǐng)輸入整數(shù):添加到初始序列中|

初始序列:產(chǎn)序結(jié)果:

Listl?|List2

“添加到初始序列中”按鈕的Click事件

PrivateSubCommandl_Click()

Listl.AdditemTextl.Text

Textl.Text=

SendKeys”{tab}''

EndSub

54

“排序”按鈕的Click事件

PrivateSubCommand2_Click()

Dimi,jAsInteger

,定義數(shù)組,以Listl的數(shù)目個(gè)數(shù)為數(shù)組維於、I

DimstrList(Listl.ListCount)AsInteger

'ReDimstrList(Listl.ListCount-1)AsInteger

,定義中間臨時(shí)變量,用于數(shù)據(jù)交換

DimstrTmpAsInteger

,將Listl中的項(xiàng)目導(dǎo)入到strList中

Fori=0ToListl.ListCount

strList(i)=(Listl.List(i))

Nexti

55

“排序”按鈕的Click事件

,按“冒泡”算法完成排序工作

Fori=0ToUBound(strList)

Forj=i+1ToUBound(strList)

IfstrList(i)>strList(j)Then

strTmp=strList(i)

strList(i)=strList(j)

strList(j)=strTmp

EndIf

Nextj

Nexti

,將排序結(jié)果輸出到List2中].

List2.Clear

Fori=0ToUBound(strList)

Listl.AddltemstrList(i)

Nexti

EndSub

56

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(1)運(yùn)行程序,在Text!文本框中輸入一個(gè)整數(shù),然后

點(diǎn)擊“添加到初始系列中”按鈕,此時(shí)會(huì)出現(xiàn)如下錯(cuò)

誤提示。

licrosoftVisualBasic

實(shí)時(shí)錯(cuò)誤'424':

要求對(duì)象

結(jié)束(£)|調(diào)試①)幫助出)]

57

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(2)點(diǎn)擊“調(diào)試”按鈕,進(jìn)入中斷模式,VB自動(dòng)標(biāo)識(shí)

出引發(fā)錯(cuò)誤的與行。

展工程1-Forml(Code)圈]仁

|CoB>andl▼(Click

一「'”添加到初始序列中;按鈕的C;ick事件

PrivateSubCommandl_Click()——

中Listl.AdditemText.Text

Textl.Text=""

SendKeys”{tab}”—

tedfSub_________________________________

'“排序”按鈕的Click事件

PrivateSubComiriand2_Click()

Dimi,jAsInteger

'定義數(shù)缸以Listl的數(shù)目個(gè)數(shù)為數(shù)組維數(shù)

DimstrList(Listl.ListCount)AsInteger

JReDimstrList(Listl.ListCount-1)AsInteger|

glI卡

58

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(3)分析錯(cuò)誤原因,&現(xiàn)該行語(yǔ)句的正確寫法是:

List1.AdditemTextl.Text

(4)修改錯(cuò)誤后,繼續(xù)執(zhí)行程序,出理如下界面:

_____________匚叵區(qū)I'

請(qǐng)給入整數(shù):添加到初始序列中

初始序列:排序結(jié)果:

排序

59

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(5)在上述界面上依次輸入以下整數(shù)序列“21,9,8,

6”后,出現(xiàn)以下界面。

*排序程序口口區(qū)I

請(qǐng)輸入整數(shù):添加到初始序列中

初始序列:排序結(jié)果:

1

2

X1

9

8

6

排序

60

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(6)點(diǎn)擊“排序”按鈕后,又出現(xiàn)如圖所示錯(cuò)誤。

MicrosoftVisualBasic

61

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(7)點(diǎn)擊“確定”按鈕后,再次進(jìn)入中斷模式,編輯器

以加重的形式指出了引發(fā)錯(cuò)誤的位置。

■工程1-Forml(Code)

PrivateSubCommand2_Click()

以Lis11的數(shù)目個(gè)數(shù)為數(shù)組維數(shù)

ReDimstrList(Listl.ListCornt

定義中間臨時(shí)變量,用干數(shù)據(jù)交換

dmstrTmpAsInteger

將Lis11中的項(xiàng)目導(dǎo)入至IstrList中

62

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(8)引發(fā)錯(cuò)誤的原因算不能用變量作為數(shù)組的下標(biāo)。作

如下修改:

融工程1-Forml(Code)

CoB>and2▼Click

'“排序”按鈕的Click事件

PrivateSubCommand2_Click()

Dimi.jAsInteger

'定義數(shù)缸以Listl的數(shù)目個(gè)數(shù)為數(shù)組維數(shù)

ReDimstrList(Listl.ListCount-1)AsInteger

'定義中間臨時(shí)變量,用于數(shù)據(jù)交換

DimstrTmpAsInteger

63

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(9)繼續(xù)執(zhí)行程序,又出現(xiàn)以下的錯(cuò)誤提示

licrosoftVisualBasic

實(shí)時(shí)錯(cuò)誤案胴:

類型不匹配

結(jié)束也)r調(diào)試@1幫助出)

64

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(10)單擊“調(diào)試”按鈕后,錯(cuò)誤定位如圖所示。

■工程1-Forml(Code)□n?

CoB*and2

定義中間臨時(shí)變量,用于數(shù)據(jù)交換

ImstrTmpAsInteger

'將Listl中的項(xiàng)目導(dǎo)入SUstrList中

Fori=0ToListl.ListCount

strList(i)=Listl.List(i)

Nexti

算法完成排序工作

FoUBound(strList)

i+1ToUEound(strList)

65

第2步:運(yùn)行程序并調(diào)試語(yǔ)法錯(cuò)誤

(11)分析錯(cuò)誤原因:我們將數(shù)組聲明為Integer數(shù)據(jù)類

型,而ListLListO表示的是字符型數(shù)據(jù),VB無(wú)法進(jìn)

行自動(dòng)類型轉(zhuǎn)換。語(yǔ)句修改為:

strList(i)=Val(Listl.List(i)

(12)繼續(xù)運(yùn)行,程序成功運(yùn)行。運(yùn)行泊次為'

一一匚n區(qū)?

請(qǐng)戰(zhàn)入整數(shù):添加到初始序列中

初始序列:排序結(jié)果:排序結(jié)果中多

211了一個(gè)數(shù)值0,

說(shuō)明程序中存

在邏輯問(wèn)題。

排序

66

第3步:設(shè)置邏輯斷點(diǎn),分析邏輯錯(cuò)誤

(1)設(shè)置如圖所示的斷點(diǎn):

加工程1-Forml(Code)匚叵區(qū)

Comaandl▼|jClick

Fori=0ToListl.ListCount▲I

strList(i)=Vai(Listl.List(i))

Nexti

,按“冒泡”算法完成排序工作

Fori=0ToU

Forj=i+1ToUBound(strList)

IfstrList(i)>strList(j)Then

strTmp=strList(i)

strList(i)=strList(j)

strList(j)=strTmp

EndIf

Nextj

Nexti

'將排序結(jié)果輸出到List2中

序I

67

第3步:設(shè)置邏輯斷點(diǎn),分析邏輯錯(cuò)誤

(2)運(yùn)行程序并輸入二組數(shù)字,比如“5,4,3,2”。

單擊“排序”按鈕后,出現(xiàn)如圖所示的界面:

序工程1-Forml(Code)二叵區(qū)

CoB>and2Click

Fori=0ToListl.ListCount

strList(i)=Vai(Listl.List(i))

Nexti

‘按“冒泡”算法完成排序工作

|Fori=0ToUBound(strList)

Forj=i+lToUBound(strList)

IfstrList(i)>strList(j)Then

strTmp=strList(i)

strList(i)=strList(j)

strList(j)=strTmp

EndIf

Nextj

Nexti

'將排序結(jié)果輸出到List2中

”1

68

第3步:設(shè)置邏輯斷點(diǎn),分析邏輯錯(cuò)誤

(3)在Vb集成環(huán)境的立即窗口中,使用“?”打印

strList數(shù)組的上接和相關(guān)的值,結(jié)果如圖所示:

立即

?ubound(strlist)

4

?strlist(0)

5

?strlist(4)

0

?strlist(3)

2

?strlist(2)

3./

?strlist(1)

4

69

第3步:設(shè)置邏輯斷點(diǎn),分析邏輯錯(cuò)誤

(4)分析原因:Listl.ListCount的最大值是4,即數(shù)字序

列中工有4個(gè)數(shù),即“5,4,3,2”。但是Listl.Liist()

下標(biāo)是從0開(kāi)始的,下標(biāo)最大值應(yīng)該為3。修改程序:

'修改數(shù)組聲明

ReDimstrList(Listl.ListCount-l)AsInteger

,修改循環(huán)次數(shù)'

Fori=0ToListl.ListCount-1

strList(i)=Val(Listl.List(i))

Nexti

70

第3步:設(shè)置邏輯斷點(diǎn),分析邏輯錯(cuò)誤

(5)修改后的運(yùn)行結(jié)果如圖所示

?排序程序

請(qǐng)輸入整數(shù):添加到初始序列中

初始序列:排序結(jié)果:

排序

71

第4步:進(jìn)一步完善程序

這個(gè)程序經(jīng)過(guò)調(diào)試能夠正常運(yùn)行了。但還存在一寫不足。

例如:

入?排序程序

請(qǐng)輸入整數(shù):添加到初始序列中

數(shù)

字?jǐn)?shù)字序列被

符初始序列:排序結(jié)果:

0重復(fù)添加到

Textl0

aaa0List2

3.23

33

中國(guó)0

0

0

3

3

排序

72

第4步:進(jìn)一步完善程序

修改程序:

(1)通過(guò)KeyPress事件控制Textl強(qiáng)件的鮑入,是它只能接收數(shù)字。

PrivateSubTextl_KeyPress(KeyAsciiAsInteger)

If

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論