發新話題

Visual Basic 教學 - 《陳述式》OnError

Visual Basic 教學 - 《陳述式》OnError

啟動一個錯誤處理常式,且指定此常式在一個訪客無法瀏覽此圖片或連結,請先 註冊登入會員 裏的位置。也可用來停止一個錯誤處理常式。

語法
  • On Error GoTo line
  • On Error Resume Next
  • On Error GoTo 0
On Error 陳述式的語法可以是下列任何一種形式:
陳述式描述
On Error GoTo line 啟動錯誤處理常式。且此常式的開始位置由 line 訪客無法瀏覽此圖片或連結,請先 註冊登入會員 指定。此line引數是必要的而且是任何訪客無法瀏覽此圖片或連結,請先 註冊登入會員 或是訪客無法瀏覽此圖片或連結,請先 註冊登入會員 。如果發生一個訪客無法瀏覽此圖片或連結,請先 註冊登入會員 ,程式控制會跳到 line 的位置,使錯誤處理程式開始動作。指定的 line 必須是和 On Error 陳述式在同一個程序裏。 否則,會發生訪客無法瀏覽此圖片或連結,請先 註冊登入會員 錯誤。
On Error Resume Next表示當一個執行階段錯誤產生時,程式控制立刻到發生錯誤陳述式接下去的訪客無法瀏覽此圖片或連結,請先 註冊登入會員 ,而繼續執行下去。當使用一個物件的時候,請使用這個陳述式,而不要使用 On Error GoTo
On Error GoTo 0停止現在程序裏任何已啟動的錯誤處理程式。

請注意
如果您不使用 On Error 陳述式,任何執行階段之錯誤都是嚴重的,結果會導致顯示錯誤訊息,並且中止執行。
一個「啟動的」錯誤處理程式是由 On Error 陳述式所打開的;一個「動作中」的錯誤處理程式是一個已啟動的錯誤處理程式正在處理錯誤。如果錯誤處理程式在動作中又發生了錯誤,(在錯誤發生和 Resume,Exit Sub,Exit Function,或 Exit Property 陳述式之間),那麼現在此程序的錯誤處理程式將無法再處理此錯誤。程式控制將會轉回原來呼叫此程序的程序。如果此呼叫程序有一個已啟動的錯誤處理程式,它將會被運用來處理此錯誤。如果此呼叫程序的錯誤處理程式也正在動作中,程式控制將會再往回傳到更先前的呼叫程式,直到碰到一個被啟動但未在動作中的錯誤處理程式為止。如果還是沒有被啟動但未動作的錯誤處理程式,那麼在錯誤實際發生的點上,程式會終止。每當錯誤處理程式將程式控制傳回呼叫的程序,該程序就成為目前的程序。在任何程序中,只要錯誤被錯誤處理程式處理完畢,那麼目前的程序將從 Resume 陳述式所指定的位置恢復執行。
附註 一個錯誤處理常式不是 Sub 程序或 Function 程序。它是一段以行標記或行號所標示的程式碼。
錯誤處理常式依賴 Err 物件的 Number 屬性來判斷發生錯誤的原因。錯誤處理常式應該在其它錯誤發生之前,或是執行一個可能發生錯誤的程序之前,先測試或儲存 Err 物件中相關的屬性值。Err 物件中的屬性值只反應最近發生的錯誤。有關 Err.Number 的錯誤訊息存放在 Err.Description 裏。
On Error Resume Next 會使程式從接著發生錯誤陳述式之後的陳述式繼續執行。或是從接著含有 On Error Resume Next 陳述式之程序的陳述式繼續執行。這個陳述式可以使程式不管執行階段錯誤而繼續執行下去。您可以將錯誤處理常式放在錯誤會發生的地方,而不必另放在同一程序裏的其它位置。當另一個程序被呼叫的時候,On Error Resume Next 不會發生作用。所以如果您希望常式裏有自建錯誤處理常式,您應該在每個呼叫的常式裏執行 On Error Resume Next 陳述式。
附註 在處理關於物件的錯誤時,On Error Resume Next 指令比 On Error GoTo 更好。每當運用物件的時候,檢查 Err 可以消除不知道程式碼在使用那一個物件的疑慮。您可以確定是那個物件將錯誤代碼放在 Err.Number 中,就如同可以確定是那個物件產生錯誤(Err.Source 中所表示的物件)。
On Error GoTo 0 取消目前程序裏的錯誤處理。它並不是表示處理錯誤的程式碼從行號 0 開始,就算程式裏真的有 0 行號也一樣。如果沒有 On Error GoTo 0 陳述式,當程序結束的時候,錯誤處理程式就自動關閉。
為了防止錯誤沒發生的時候,錯誤處理程式碼也被執行,請在錯誤處理常式之前立即放上 Exit Sub,Exit Function,Exit Property 陳述式,就像下列程式片段一樣:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)   On Error GoTo ErrorHandler   . . .   Exit SubErrorHandler:   . . .Resume NextEnd Sub在上面,錯誤處理程式碼跟在 Exit Sub 陳述式 之後,而且在 End Sub 陳述式之前,以便和程序裏的流程分開。錯誤處理程式碼可以放在程序裏的任何位置。
檔案執行時,所有未被捕抓的錯誤都被傳回控制應用程式。在程式開發環境時,必須設定正確的選項,未被捕抓的錯誤才會被傳回控制應用程式。請參考您的訪客無法瀏覽此圖片或連結,請先 註冊登入會員 說明文件以便得知除錯時有那些選項應該被設定、如何設定,以及是否能建立訪客無法瀏覽此圖片或連結,請先 註冊登入會員
如果您建立一個物件,而且它會運用到其它物件,那麼您必須試著去處理從那些物件傳回的未處理錯誤。如果您沒辦法處理這種錯誤,請將 Err.Number 中的錯誤代碼當作您的錯誤代碼,然後將錯誤代碼傳回給呼叫您物件的呼叫者。您應該將您的錯誤代碼加入 vbObjectError 常數,以指定您的錯誤。舉例來說,如果您的錯誤代碼是 1052,使用如下的方法來指定:
Err.Number = vbObjectError + 1052附註 當呼叫訪客無法瀏覽此圖片或連結,請先 註冊登入會員 (DLL) 所產生的系統錯誤,並不會引起例外情況,而且無法被 Visual Basic 捕抓錯誤所捕抓。當呼叫 DLL 函數時,您應該每次都檢查傳回值以確定是成功或失敗 (根據 API 的特性)。而且在失敗的時候,檢查 Err 物件的 LastDLLError 屬性。

On Error 陳述式範例本範例先使用 On Error GoTo 陳述式在一個程序中指定錯誤處理的程式碼所在。範例中的錯誤狀況為「試圖刪除一已經開啟的檔案」,而產生的錯誤碼為 55。這個狀況將由範例中的錯誤處理程式碼來處理,處理完後,程式的執行步驟會回到發生錯誤的陳述式之處。若使用 On Error GoTo 0 陳述式則關閉錯誤處理程式,且然後使用 On Error Resume Next 陳述式來改變錯誤處理方式,以便在錯誤發生後繼續執行。請注意範例中使用 Err.Clear 在錯誤狀況處理完後,清除 Err 物件的屬性。
 Sub OnErrorStatementDemo()   On Error GoTo ErrorHandler              ' 開啟錯誤處理程式   Open "TESTFILE" For Output As #1        ' 開啟一個檔案作輸出   Kill "TESTFILE"                         ' 試圖刪除已開啟的檔案   On Error Goto 0                         ' 關閉錯誤處理程式   On Error Resume Next                    ' 將錯誤處理的方式設為「繼續下一行」   ObjectRef = GetObject("MyWord.Basic")   ' 試圖啟動不存在的物件                ' 檢查可能發生的 Automation 錯誤   If Err.Number = 440 Or Err.Number = 432 Then      ' 告訴使用者出了什麼事,然後清除 Err 物件      Msg = "There was an error attempting to open the Automation object!"      MsgBox Msg, , "Deferred Error Test"      Err.Clear                            ' 清除 Err 物件   End If   Exit Sub                                   ' 離開程式,以避免進入錯誤處理程式ErrorHandler:                              ' 錯誤處理程式   Select Case Err.Number                  ' 檢查錯誤代碼      Case 55                              '   錯誤碼 55 ─表示發生「檔案已開啟」之錯誤         Close #1                          '     關閉已開啟之檔案      Case Else                            '   其它錯誤狀況          ' 處理其它錯誤狀況 . . .    End Select   Resume                                  ' 將程式執行步驟回到原發生錯誤的陳述式中End Sub

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。