国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VB容錯處理策略(全)
userphoto

2010.11.26

關注
本文包括以下幾節(jié)內容: 使用On Error語句 如何離開錯誤處理程序 定義錯誤常數 將錯誤處理程序單獨存放 理解錯誤處理的范圍 不要嵌套使用錯誤處理程序
使用On Error語句
Visual Basic程序使用On Error命令來登記錯誤處理程序,它有下面3種形式:
On Error GoTo 0 On Error Resume Next On Error GoTo line
These forms tell Visual Basic what it should do when the program encounters an error. The three forms are described in the following sections.
這些代碼告訴Visual Basic程序當遇到錯誤時應該做什么。下面詳細介紹這3種語句。
On Error GoTo 0
On Error GoTo 0比較直接,它僅僅中止任何當前安裝的錯誤處理代理(比如在前面安裝的On Error GoTo line或者On Error Resume Next語句)。如果程序在其后遇到錯誤,那么就會崩潰。
On Error Resume Next
這種方法使程序忽視發(fā)生的錯誤,當遇到一個錯誤時,程序繼續(xù)在其后執(zhí)行。如果程序使用了On Error Resume Next命令,那么就應該在每次可能產生錯誤的操作后面檢查一下Err對象的數值。如果Err.Number不為零,就表明操作產生了錯誤,程序可以對此采取特殊的動作。注意:在可能發(fā)生問題的語句后,程序應該立即檢查Err.Number的數值,因為,其他的錯誤操作將復位Err對象并清除前面的錯誤信息。
許多開發(fā)人員在給用戶一個通用對話框后使用On Error Resume Next命令。 CommandDialog控件的CancelError屬性指明了當用戶Cancel對話框時是否產生一個錯誤。下面的代碼段顯示了程序如何使用CancelError判斷是否繼續(xù)一個操作,比如裝入一個文件。
' 如果用戶選擇了cancel,就產生一個錯誤 dlgOpenFile.CancelError = True ' 忽視錯誤的發(fā)生 On Error Resume Next ' 顯示對話框 dlgOpenFile.ShowOpen ' 判斷是否有錯誤 If Err.Number = cdlCancel Then ' 如果是用戶canceled,就什么也執(zhí)行 Exit Sub ElseIf Err.Number <> 0 Then ' 如果是未知錯誤,就采取另外的行為 : End If ' 恢復正常的錯誤處理 On Error GoTo 0
On Error GoTo Line
使用這個方法,將登記一個新的錯誤處理代理。如果程序遇到錯誤,控制將轉移到定義的程序行,然后再執(zhí)行特殊的處理。
請看下面的代碼:          Private Sub DoSomething() ' 安裝錯誤處理代理 On Error GoTo UnexpectedError ' 日常操作 : ' 使程序不進入下面的錯誤處理代理程序 Exit Sub UnexpectedError: '將錯誤信息描述給用戶 MsgBox "Unexpected error" & _ Str$(Err.Number) & _ " in subroutine DoSomething." & _ vbCrLf & _ Err.Description Exit Sub End Sub
如何離開錯誤處理程序
有下面幾種方法可以使程序離開錯誤處理代理程序的控制,然后返回到正常的執(zhí)行代碼處:
Resume Resume Next Exit Sub/Function/Property End Sub/Function/Property Err.Raise
下面對它們進行詳細地描述。
Resume
執(zhí)行Resume語句后,將重復執(zhí)行發(fā)生錯誤的那條命令。如果那條命令仍然不正確,程序將再次發(fā)生錯誤,這將使程序進入一個不停的循環(huán)操作中。為了避免這種循環(huán)發(fā)生,一般不要使用Resume命令,除非在錯誤處理代理程序中能對錯誤進行修復。
例如,下面的代碼試圖裝入一個可能存儲在軟盤上地文件。如果失敗,將報告錯誤,詢問用戶是否再試一試。如果磁盤不在軟驅中,用戶可以將之插入然后點擊Retry按鈕。這里的程序就是使用了Resume命令實現再次打開文件。當程序又一次失敗時,就會再次轉到錯誤處理代理程序中,給用戶再次修正錯誤的機會。最終,直到用戶修正了錯誤,或者點擊了Cancel按鈕。如果點擊了Cancel按鈕,程序退出,沒有打開文件。    Private Sub LoadData(ByVal filename As String) Dim fnum As Integer '打開文件 fnum = FreeFile On Error GoTo OpenError Open filename For Input As fnum ' 讀取數據 On Error GoTo ReadError : ' 關閉文件 On Error GoTo CloseError Close fnum Exit Sub OpenError: ’打開文件失敗,詢問用戶是否再次打開 If MsgBox("Error" & _ Str$(Err.Number) & _ " opening file " & filename & "." & _ vbCrLf & Err.Description & vbCrLf & _ "Check that the disk is properly " & _ "inserted and click the Retry button.", _ vbRetryCancel, _ "Error opening file") = vbRetry _ Then '再次打開文件 Resume End If ’否則,選擇Cancel退出這個過程 Exit Sub ReadError: MsgBox "Error" & _ Str$(Err.Number) & _ " reading file " & filename & "." & _ vbCrLf & Err.Description '關閉文件 Close fnum Exit Sub CloseError: ' 關閉文件發(fā)生錯誤 MsgBox "Error" & _ Str$(Err.Number) & _ " closing file " & filename & "." & _ vbCrLf & Err.Description Exit Sub End Sub
Resume Next
執(zhí)行Resume Next命令使程序在發(fā)生錯誤那條命令后繼續(xù)執(zhí)行,這對于程序和用戶不能合理地修正錯誤時很有意義,但同時程序可能執(zhí)行不完整。
比如,下面的代碼使用CDate函數轉換一個字符串為日期格式,如果失敗了,錯誤處理代理程序就分配給start_date變量的值為當前的日期:    Private Sub ValidateStartDate(ByVal date_string As String) Dim start_date As Date ' 安裝錯誤處理代理 On Error GoTo InvalidDate ' 轉換字符串為日期格式 start_date = CDate(date_string) ' 執(zhí)行關于這個日期的一些操作 : ' 不進入下面的錯誤處理代理程序中 Exit Sub InvalidDate: ' 如果日期非法,就使用當前日期 start_date = Date Resume Next End Sub
請注意,盡量不要使用這種方法處理錯誤,因為它采取了“安靜”的方式,而不是明顯地告訴用戶發(fā)生了錯誤。應該是這樣,當用戶輸入了非法日期后,就提示他發(fā)生了錯誤,并要求輸入一個新的數值。
Exit Sub/Function/Property
如果程序不能繼續(xù)它的任務,可以立即使用 Exit Sub、 Exit Function 或者 Exit Property 實現退出。下面的代碼是上面那段程序的一個新版本,如果日期字符串非法,就告訴給用戶,然后退出程序:
Private Sub ValidateStartDate(ByVal date_string As String) Dim start_date As Date ' 安裝錯誤處理代理 On Error GoTo InvalidDate ' 轉換字符串為日期 start_date = CDate(date_string) ' 執(zhí)行關于這個日期的一些操作 : ' 不進入下面的錯誤處理代理程序中 Exit Sub InvalidDate: ' 如果日期非法,就告訴用戶,然后退出 MsgBox "The start date """ & _ date_string & _ """ is invalid. Please enter a new one." Exit Sub End Sub
按照這種方式退出程序,調用的程序就不可能告訴用戶錯誤發(fā)生了。這意味著:不管程序是否成功,調用程序能夠合適地繼續(xù)執(zhí)行時,才適于采用這個方法。如果調用者必須要知道錯誤發(fā)生了,那么代碼中就必須要使用Err.Raise命令來簡短地進行一下描述。
End Sub、 End Function End Property
如果錯誤處理代理程序最后接觸到程序的 End Sub、 End Function 或者 End Property 語句,就會產生自然執(zhí)行Exit命令的效果。比如,上面那段代碼的最后部分可以這么編寫:
InvalidDate: ' 如果日期非法,就告訴用戶,然后退出 MsgBox "The start date """ & _ date_string & _ """ is invalid. Please enter a new one." End Sub
可是有時候,這么處理會帶來一些混淆。因為,也可能要處理新的錯誤,那么再隨后添加新的錯誤處理代理程序時,就有可能注意不到上一個錯誤處理代理程序沒有使用Exit語句做為結尾,這樣,就會發(fā)生上一個錯誤處理代理程序直接執(zhí)行到下一個代碼段中。比如,下面的代碼段中,如果遇到一個非法日期,將會顯示2段出錯提示信息,而不是實際應該存在的1個:
InvalidDate: ' 如果日期非法,就告訴用戶,然后退出 MsgBox "The start date """ & _ date_string & _ """ is invalid. Please enter a new one." ReadFileError: '讀取文件錯誤 MsgBox "Error reading the data." : End Sub
因此,為了避免這種錯誤的發(fā)生,不要讓錯誤處理代理程序直接接觸到過程的End命令做為結束。要使用Exit命令完成離開程序的功能!
Err.Raise
Err對象提供了一個Raise方法,它允許程序產生一個新錯誤,或者再次產生上一次的錯誤。它的語法如下:
Err.Raise Number, [Source], [Description], [Helpfile], [Helpcontext]    Number
錯誤代碼。為了在類模塊中建立一個新的錯誤代碼,將 vbObjectError 加上實際的代碼。
比如: vbObjectError + 1001。
Source
產生錯誤的對象或者應用的名字。對于對象,使用Project.Class格式。對于程序,使用Project.Routine格式。比如,MyProgram.LoadData.
Description 關于錯誤的描述字符串。
Helpfile 關于錯誤詳細信息的幫助文件名字。error.
Helpcontext 幫助文件中對應這個錯誤的上下文ID。
錯誤信息處理策略
如果程序本身不能處理錯誤,就應該生成一個新的錯誤,其中帶有相關環(huán)境的信息。比如,下面的程序視圖讀取一個數據文件,如果沒有找到文件,FileOpenError錯誤處理代理程序就生成了myappErrNoInputFile錯誤,這將提供給調用程序比Visual Basic原本錯誤信息更多的資料。Visual Basic對這個錯誤的信息就是“文件沒有發(fā)現”,然而經過處理后的新出錯信息是“輸入數據文件沒有發(fā)現”。甚至于,Err.Description域可以包含沒有發(fā)現的文件名。
' 定義應用程序錯誤常量 Private Const myappErrNoInputFile = vbObjectError + 1000 : '定義Visual Basic錯誤常量 Private Const vbErrFileNotFound = 53 : Private Sub ReadInputData(ByVal file_name As String) Dim file_number As Integer '打開文件 file_number = FreeFile On Error GoTo FileOpenError Open file_name For Input As file_number ' 操作文件出錯 On Error GoTo FileReadError : ' 操作文件 : '關閉文件 Close file_number Exit Sub FileOpenError: ' 打開文件錯誤 If Err.Number = vbErrFileNotFound Then '如果文件沒有找到,轉換錯誤信息為myappErrNoInputFile. Err.Raise myappErrNoInputFile, _ "MyApp.ReadInputData", _ "Could not open input file """ & _ file_name & """." Else '其他錯誤處理 Err.Raise Err.Number, _ Err.Source, _ Err.Description, _ Err.HelpFile, _ Err.HelpContext End If Exit Sub FileReadError: '讀取文件錯誤 : Exit Sub End Sub
程序可以使用與下面類似的代碼來執(zhí)行。錯誤處理代理使用保存在Err對象中的信息,這個信息由Raise方法產生。
On Error GoTo DataInputError ReadInputData "c:mydata.dat" Exit Sub DataInputError: ‘裝載數據錯誤 MsgBox "Error" & Str$(Err.Number) & _ " loading the input data." & vbCrLf & _ Err.Description
如前所示,程序格式化了出錯提示信息。為了簡單化處理,程序可以不格式化由Raise命令產生的錯誤描述。比如,
Err.Raise myappErrNoInputFile, _ "MyApp.ReadInputData", _ "Error" & Str$(myappErrNoInputFile) & _ " opening the input file."
當錯誤發(fā)生時,撲捉到錯誤的代理程序將可能顯示類似下面的信息:
Error -2147220504 loading the input data.Error -2147220504 opening the input file.
將格式化信息的任務交給實際記錄錯誤信息并給用戶提供顯示信息的程序。
定義錯誤常數
微軟定義的通常錯誤信息代碼范圍是從1到65,535,其中從1到1000做保留使用,從31,000到31073被Visual Basic使用。其余范圍內的值就是你可以自定義的了。
微軟同時建議:定義新的錯誤常數時,最好在常數vbObjectError上加上一定的數值,比如:
Private Const myclassErrNoInputFile = vbObjectError + 1000
如果遵循了這些原則,自定義的錯誤代碼就不會與微軟公司的相覆蓋。
但是很不幸,這并不能保證你所定義的錯誤代碼不與其他開發(fā)者或者用到的庫函數中定義的錯誤常數發(fā)生沖突。為了防止這個沖突,可以定義一個基值,比如vbObjectError,然后再按一定的次序定義新錯誤常數。比如:    Public Const rayErrorBase = 45300 Public Const rayParametersNotSet = rayErrorBase + 1 Public Const rayInvalidSphereFormat = rayErrorBase + 2 Public Const rayLightAtEye = rayErrorBase + 3 :
如果隨后發(fā)現新定義的錯誤常數與其他程序發(fā)生沖突,就可以迅速地通過改變基值實現重新定義了所有的錯誤常量。
將錯誤處理程序單獨存放
請使用Resume、Resume Next、Exit Sub/Function/Property、End Sub/Function/Property 或者 Err.Raise來結束錯誤處理代理程序的編寫。永遠不要發(fā)生從一個錯誤代理進入到另一個錯誤代理的代碼處理過程。
比如,下面的代碼就發(fā)生了這種不好的情況:    Private Sub LoadData(ByVal filename As String) Dim fnum As Integer ‘文件還沒有打開 On Error GoTo FileIsClosed ’打開文件 fnum = FreeFile Open filename For Input As fnum ‘文件被打開了 On Error GoTo FileIsOpen ’讀取數據 : 進入錯誤處理代理,關閉文件 On Error Resume Next FileIsOpen: ‘關閉文件 Close fnum FileIsClosed: ’執(zhí)行其他任務 : ‘結束程序 End Sub
這段代碼就存在幾個問題。首先,它讓人感到困惑。當添加新的錯誤處理代理程序時,可能就會發(fā)生誤會。同時,代碼中沒有顯示錯誤信息,相反,代碼“安靜”地執(zhí)行,就好像沒有發(fā)生任何錯誤。所以,為了防止這些,一定記住,單獨地編寫每塊錯誤處理代理程序。
理解錯誤處理程序的作用范圍
當程序遇到錯誤時,Visual Basic檢查在當前程序段中是否安裝了錯誤處理代理程序。如果安裝了,控制將轉移到那個程序段中。如果沒有發(fā)現,Visual Basic上移到調用堆棧中的調用相應,檢查是否在那個程序段中安裝了錯誤處理代理程序。如果安裝了,系統將在那個錯誤代理中恢復執(zhí)行。如果仍沒有發(fā)現,就一直上移,直到找到一個安裝的錯誤處理代理程序。如果最終沒有找到,程序將崩潰。
因此,所有Visual Baisc代碼執(zhí)行時,開始要設有一個事件處理代理或者一個Main程序。這意味著,如果在每個事件處理和Main程序中放置錯誤處理代理程序,就能防御所有的錯誤發(fā)生。然后,不管程序在哪里發(fā)生錯誤,控制最終都能轉移到這里。 不要嵌套使用錯誤處理程序
錯誤處理代理程序運行上與其他程序有些不同,在一段錯誤處理代理的代碼中,不可能激活另外的錯誤處理代理程序。換言之,一段錯誤處理代理程序中不能使用On Error GoTo來定義撲捉它自身錯誤的代碼。如果其中使用了這個語句,只有當這個錯誤處理代理程序執(zhí)行完成并返回到主代碼中時,新的錯誤處理代理程序才可能發(fā)生效果。
嵌套使用錯誤代理的事情非常容易使人困惑。在下面的代碼中,如果Subroutine2產生一個錯誤,就不能確定是否控制將轉移到Error1還是Error2中。如果Subroutine1運行正確,控制將轉到Error1,但是當Subroutine1發(fā)生錯誤時,控制將轉移到Error2:    On Error GoTo Error1 Subroutine1 Subroutine2 Exit Sub Error1: On Error GoTo Error2 MsgBox "Error1:" & Str$(Err.Number) & "." & vbCrLf & _ Err.Description Resume Next Error2: MsgBox "Error2:" & Str$(Err.Number) & "." & vbCrLf & _ Err.Description Resume Next
因此,不要在一段錯誤處理代理程序中使用On Error語句,應該將所有的錯誤處理代理程序段按照順序編寫。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關于VBA中的錯誤處理
在VB中怎樣編寫錯誤處理程序
VBA 程序之錯誤處理
關于vb中捕獲錯誤語句的使用
VBA錯誤處理
【VBA】on error
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服