On Error 陳述式
啟用錯誤處理例程,並指定 程式內的例程位置;也可以用來停用錯誤處理例程。
語法
On Error GoToline
發生錯誤時繼續下一步
On Error GoTo 0
On Error 語句語法可以有下列任何形式:
陳述式 | 描述 |
---|---|
On Error GoToline | 啟用從必要行自變數中指定行開始的錯誤處理例程。 行自變數是任何行標籤或行號。 如果發生 運行時錯誤 ,請將分支控制到 一行,讓錯誤處理程式變成作用中。 指定 的行 必須與 On Error 語句在相同的程式中;否則會發生 編譯時期 錯誤。 |
發生錯誤時繼續下一步 | 指定當發生運行時錯誤時,控件會移至緊接在發生錯誤之語句後面的語 句 ,並繼續執行。 存取物件時,請使用此表單,而不是 On Error GoTo 。 |
On Error GoTo 0 | 停用目前程式中任何已啟用的錯誤處理程式。 |
註解
如果您未使用 On Error 語句,則發生的任何運行時錯誤都是嚴重錯誤;也就是說,會顯示錯誤訊息並停止執行。
「已啟用」錯誤處理程式是由 On Error 語句開啟的錯誤處理程式;「作用中」錯誤處理程式是正在處理錯誤的已啟用處理程式。 如果在錯誤處理程式作用中時發生錯誤, (發生錯誤與 Resume、Exit Sub、Exit 函數或 Exit 屬性語句) 之間,則目前程式的錯誤處理程式無法處理錯誤。 控件會回到呼叫程式。
如果呼叫程式已啟用錯誤處理程式,則會啟動它來處理錯誤。 如果呼叫程式的錯誤處理程式也是作用中,則控件會透過先前的呼叫程式傳回,直到找到啟用但非作用中的錯誤處理程序為止。 如果找不到非作用中、啟用的錯誤處理程式,則錯誤在實際發生時會是嚴重錯誤。
每次錯誤處理程式將控件傳遞回呼叫程式時,該程式就會變成目前的程式。 在任何程式中的錯誤處理程式處理錯誤之後,在 Resume 語句所指定的點繼續執行目前程式。
錯誤處理例程依賴 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 GoTo 偏好。 每次與對象互動之後檢查 Err ,會移除程式代碼所存取物件的模棱兩可。 您可以確定哪個物件將錯誤碼放在 Err.Number 中,以及原先產生錯誤的物件 (Err.Source) 中指定的物件。
在 Error GoTo 0 上,停用目前程式中的錯誤處理。 即使程序中包含編號為 0 的行,它也不會將第 0 行指定為錯誤處理程式碼的開始。 如果沒有 On Error GoTo 0 語 句,當程序結束時,會自動停用錯誤處理程式。
若要防止錯誤處理程式代碼在未發生錯誤時執行,請將 Exit Sub、 Exit 函式或 Exit Property 語句放在錯誤處理程式之前,如下列片段所示:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
在這裡,錯誤處理程式碼會遵循 Exit Sub 語句,並在 End Sub 語句之前,將它與程式流程區隔開來。 錯誤處理程式碼可以放在程式中的任何位置。
當物件以可執行檔執行時,物件中未載入的錯誤會傳回至控制應用程式。 在開發環境中,只有在設定適當的選項時,未載入的錯誤才會傳回給控制應用程式。 如需偵錯期間應設定哪些選項、如何設定選項,以及主機是否可以建立類別的說明,請參閱主應用程式的檔。
如果您建立可存取其他物件的物件,您應該嘗試處理未處理的從中傳回的錯誤。 如果您無法處理這類錯誤,請將 Err.Number 中的錯誤碼對應至您自己的其中一個錯誤,然後將錯誤傳回物件的呼叫端。 您應該藉由將錯誤碼新增至 vbObjectError 常數來指定錯誤。 例如,如果您的錯誤碼是 1052,請指派它,如下所示:
Err.Number = vbObjectError + 1052
注意事項
呼叫 Windows 動態連結庫 (DLL) 或 Macintosh 程式代碼資源時發生系統錯誤,不會引發例外狀況,也無法因 Visual Basic 錯誤捕捉而擷取。 呼叫 DLL 函式時,您應該根據 API 規格) 來檢查每個傳回值是否成功或失敗 (,如果發生失敗,請檢查 Err 物件的 LastDLLError 屬性中的值。 LastDLLError 一律會在 Macintosh 上傳回零。
範例
此範例會先使用 On Error GoTo 語句來指定程式中錯誤處理程式的位置。 在此範例中,嘗試刪除開啟的檔案會產生錯誤號碼 55。 錯誤會在錯誤處理例程中處理,然後將控制權傳回給造成錯誤的語句。 On Error GoTo 0 語句會關閉錯誤捕捉。
接著會使用 On Error Resume Next 語句來延遲錯誤捕捉,讓下一個語句所產生之錯誤的內容可以是特定的。 請注意,處理錯誤之後,會使用 Err.Clear 來清除 Err 物件的屬性。
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Open "TESTFILE" For Output As #1 ' Open file for output.
Kill "TESTFILE" ' Attempt to delete open
' file.
On Error Goto 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent
' object, then test for
'Check for likely Automation errors.
If Err.Number = 440 Or Err.Number = 432 Then
' Tell user what happened. Then clear the Err object.
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' Clear Err object fields
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 55 ' "File already open" error.
Close #1 ' Close open file.
Case Else
' Handle other situations here...
End Select
Resume ' Resume execution at same line
' that caused the error.
End Sub
另請參閱
支援和意見反應
有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應。