非結構化例外處理概觀
更新:2007 年 11 月
在「非結構化例外處理」(Unstructured Exception Handling) 中,您可將 On Error 陳述式放在一個程式碼區塊的開頭,它會處理任何發生在這個區塊中的錯誤。在 On Error 陳述式執行後,若程序發生例外狀況時,程式會分支至 On Error 陳述式中指定的行引數。行引數是表示例外處理常式位置的行號或行標籤。
有時候原始程序會呼叫其他程序,而例外狀況則發生在被呼叫的程序中。在這種情況下,如果被呼叫的程序並未處理該例外狀況,則此例外狀況就會被傳遞回呼叫程序,而執行會跳至行引數。
![]() |
---|
使用 On Error 的非結構化錯誤處理會降低應用程式的效能,產生難以偵錯與維護的程式碼。建議您使用結構化錯誤處理方式。如需詳細資訊,請參閱 Visual Basic 的結構化例外處理概觀。 |
On Error GoTo Line
On Error GoTo Line 陳述式會假定錯誤處理程式碼於要求的 line 引數中指定行開始。如果發生了執行階段錯誤,控制權會分支至引數中指定的行標籤或行號,啟動錯誤處理常式 *。*指定行必須位於與 On Error GoTo Line 陳述式相同的程序中,否則 Visual Basic 將產生編譯器錯誤。下列範例說明錯誤處理常式的使用方法,包含行標籤:
Sub TestSub
On Error GoTo ErrorHandler
' Code that may or may not contain errors.
Exit Sub
ErrorHandler:
' Code that handles errors.
Resume
End Sub
此範例包含一個名為 ErrorHandler 的錯誤處理常式。如果 TestSub 副程式中的任何程式碼產生錯誤,Visual Basic 會立刻執行 ErrorHandler 標籤之下的程式碼。在錯誤處理區塊的結尾,Resume 陳述式會將控制權傳回至錯誤第一次發生的那一行程式碼。副程式的其他部分會繼續執行,像是錯誤並未發生一般。
![]() |
---|
您必須緊貼在錯誤處理區塊之前放置 Exit Sub 陳述式。否則,當 Visual Basic 到達副程式的結尾時會執行錯誤處理程式碼,導致您不要的或是非預期的結果。 |
On Error Resume Next
On Error Resume Next 陳述式指定在執行階段錯誤事件中,將控制權傳送至緊接在發生錯誤的陳述式之後的那一個陳述式。此時,執行會繼續。On Error Resume Next 可讓您將錯誤處理常式放在錯誤會發生的地方,而不是將控制權傳送至程序中的另一個位置。
![]() |
---|
如果您的程序呼叫其他程序,On Error Resume Next 則陳述式在被呼叫程序執行期間將變成非使用中。因此,應該將 On Error Resume Next 陳述式放在每一個需要該陳述式的被呼叫程序中。這麼做是必要的,因為 Resume Next 行為只可套用至含有 On Error Resume Next 陳述式的程序中。如果在被呼叫程序中發生未處理的錯誤,此例外狀況會被傳遞回呼叫程序,而程式會在呼叫之後的陳述式繼續執行。在這種情況下,錯誤並未被處理。 |
Resume 也可以在 On Error 陳述式之外單獨使用。以這種方式使用 Resume 時,Visual Basic 會將控制權傳回引起錯誤的陳述式。通常您可在錯誤處理常式修正錯誤之後使用 Resume。
Visual Basic 也提供了 Resume Next 陳述式,它可以將控制權引導至緊接在引起錯誤的那一行程式碼之後的那一行。您可在錯誤不會使應用程式停止的情況下使用 Resume Next。如果錯誤不會改變您的副程式所預期的結果,您也可以使用。
另一個 Resume 陳述式的分支是 Resume Line,與 On Error GoTo Line 類似。Resume Line 將控制權傳送至 line 引數中指定的行。您只能在錯誤處理常式中使用 Resume Line。
![]() |
---|
進行程式碼偵錯時,必須停用 On Error Resume Next 陳述式。 |
On Error GoTo 0
On Error GoTo 0 陳述式會停用目前程序中的任何錯誤處理常式。如果您沒有將 On Error GoTo 0 陳述式包含在內,當含有例外處理常式的程序結束時,亦會停用錯誤處理常式。
![]() |
---|
On Error GoTo 0 陳述式不是要將第 0 行指定為錯誤處理程式碼的起始,即使程序含有編號為 0 的行也一樣。 |
On Error GoTo -1
On Error GoTo -1 陳述式會停用目前程序中的任何例外處理常式。如果您未將 On Error GoTo -1 陳述式包含在內,例外處理常式會在程序結束時自動停用。
![]() |
---|
On Error GoTo -1 陳述式並不是要將 -1 行指定為錯誤處理程式碼的起始,即使程序含有編號為 -1 的行也一樣。 |
非結構化例外處理常式範例
在下列程式碼中,例外處理常式名為 DivideByZero,它處理的是特定的錯誤:試圖除以零。如果發生不同的錯誤,Visual Basic 會引發執行階段錯誤並停止應用程式。
Sub ErrorTest ()
' Declare variables.
Dim x As Integer, y As Integer, z As Integer
' The exception handler is named "DivideByZero".
On Error GoTo DivideByZero
' The main part of the code, which might cause an error.
x = 2
y = 0
z = x \ y
' This line disables the exception handler.
On Error GoTo 0
Console.WriteLine(x & "/" & y & " = " & z)
' Exit the subroutine before the error-handling code.
' Failure to do so can create unexpected results.
Exit Sub
' This is the exception handler, which deals with the error.
DivideByZero:
' Include a friendly message to let the user know what is happening.
Console.WriteLine("You have attempted to divide by zero!")
' Provide a solution to the error.
y = 2
' The Resume statement returns to the point at which
' the error first occurred, so the application
' can continue to run.
Resume
End Sub