




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合肥幼兒師范高等專科學(xué)?!秳?chuàng)新理論與方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆政法學(xué)院《新聞算法與編程》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津渤海職業(yè)技術(shù)學(xué)院《衛(wèi)星通信系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川國(guó)際標(biāo)榜職業(yè)學(xué)院《建筑工程造價(jià)管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古大學(xué)《新能源汽車概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024屆河北省石家莊二中實(shí)驗(yàn)學(xué)校高三下學(xué)期仿真模擬歷史試卷
- 2024-2025學(xué)年山東省聊城市第二中學(xué)高一上學(xué)期12月月考?xì)v史試卷
- 新疆醫(yī)科大學(xué)《高層建筑智慧施工》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州科技貿(mào)易職業(yè)學(xué)院《建筑CAD》2023-2024學(xué)年第二學(xué)期期末試卷
- 嶺南師范學(xué)院《高電壓技術(shù)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- DZ∕T 0207-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 硅質(zhì)原料類(正式版)
- 數(shù)字貿(mào)易學(xué) 課件 第1-3章 導(dǎo)論、數(shù)字貿(mào)易的產(chǎn)生與發(fā)展;消費(fèi)互聯(lián)網(wǎng)、產(chǎn)業(yè)互聯(lián)網(wǎng)與工業(yè)互聯(lián)網(wǎng)
- 《飛向太空的航程》基礎(chǔ)字詞梳理
- GB/T 144-2024原木檢驗(yàn)
- 追覓入職測(cè)評(píng)題庫(kù)
- 寧德時(shí)代入職測(cè)評(píng)試題答案
- 干粉滅火器的使用方法課件
- 2024年廣東省2024屆高三高考模擬測(cè)試(一)一模 化學(xué)試卷(含答案)
- 半導(dǎo)體行業(yè)質(zhì)量管理與質(zhì)量控制
- 2024年山東省春季高考技能考試汽車專業(yè)試題庫(kù)-下(判斷題匯總)
- 部編版道德與法治二年級(jí)下冊(cè)第三單元 綠色小衛(wèi)士 單元作業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論