共用方式為


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 SubExit 函數或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 SubExit 函式或 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 支援與意見反應