非结构化异常处理概述

更新:2007 年 11 月

在“非结构化异常处理”中,您将 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 语句将控制传递回最先发生错误的代码行。然后,该子例程的剩余部分继续执行,就像没有发生错误一样。

说明:

必须将 ExitSub 语句紧挨着错误处理块的前面放置。否则,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 还提供了 ResumeNext 语句,该语句将控制定向到紧跟在导致错误的代码行后面的行。可以将 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 并处理特定的错误(即尝试被 0 除)。如果发生另外的错误,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

请参见

任务

如何:从 Err 对象中检索信息

概念

非结构化异常处理中的 Err 对象

异常处理介绍

错误类型

选择何时使用结构化异常处理和非结构化异常处理

参考

End 语句

Err 对象 (Visual Basic)

Exit 语句 (Visual Basic)

On Error 语句 (Visual Basic)

Resume 语句