Try...Catch...Finally 语句 (Visual Basic)

更新:2007 年 11 月

用于处理给定代码段中可能出现的某些或所有错误,而同时代码仍保持运行。

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try

各部分说明

  • tryStatements
    可选。可能发生错误的语句。可以是复合语句。

  • Catch
    可选。允许使用多个 Catch 块。如果在处理 Try 块时发生异常,则会按文本顺序检查每条 Catch 语句,以确定它是否处理异常,exception 代表已引发的异常。

  • exception
    可选。任何变量名称。exception 的初始值是引发的错误的值。它将与 Catch 一起使用以指定所捕获的错误。如果省略,则 Catch 语句将捕获所有异常。

  • type
    可选。指定类筛选器的类型。如果 exception 的值采用的是 type 所指定的类型或者派生类型,则该标识符将绑定到异常对象。

  • When
    可选。带有 When 子句的 Catch 语句只会在 expression 的计算结果为 True 时捕获异常。When 子句仅在检查异常类型之后应用,expression 可以引用表示异常的标识符。

  • expression
    可选。必须可隐式转换为 Boolean。说明一般筛选器的任何表达式。通常用来根据错误号进行筛选。它与 When 关键字一同使用,以指定捕获错误时的环境。

  • catchStatements
    可选。用于处理在关联的 Try 中发生的错误的语句。可以是复合语句。

  • Exit Try
    可选。用于退出 Try...Catch...Finally 结构的关键字。将继续执行紧跟在 End Try 语句后面的代码。Finally 语句仍将被执行。不允许在 Finally 块中使用。

  • Finally
    可选。当执行过程离开 Try 语句的任何部分时,总是会执行 Finally 块。

  • finallyStatements
    可选。在所有其他错误处理结束后执行的语句。

  • End Try
    终止 Try...Catch...Finally 结构。

备注

Try 块中的局部变量将无法在 Catch 块中使用,因为它们是独立的块。如果要在多个块中使用某个变量,请在 Try...Catch...Finally 结构之外声明该变量。

Try 块包含可能发生错误的代码,而 Catch 块则包含可处理任何发生的错误的代码。如果 Try 块中发生错误,程序控制权将传递给相应的 Catch 语句以进行部署。exception 参数是 Exception 类或派生自 Exception 类的类的实例。Exception 类实例与 Try 块中发生的错误相对应。该实例包含有关错误的信息,其中包括错误号和消息以及其他信息。

如果 Catch 语句不指定 exception 参数,则将捕获任何类型的系统或应用程序异常。在捕获所有预期的特定异常之后,通常应将此变体用作 Try...Catch...Finally 结构中的最后一个 Catch 块。如果不使用 exception 参数,则控制流永远不能到达 Catch 后的 Catch 块。

在部分信任的情况下(如网络共享上承载的应用程序),Try...Catch...Finally 将不会捕获在调用包含该调用的方法之前发生的安全异常。当将下面的示例放置在服务器共享上并从此处运行时,将生成错误“System.Security.SecurityException: 请求失败”。有关安全异常的更多信息,请参见 SecurityException 类。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
    Try
        Process.Start("https://www.microsoft.com")
    Catch ex As Exception
        MsgBox("Can't load Web page" & vbCrLf & ex.Message)
    End Try
End Sub

在这种部分信任的情况下,您必须将 Process.Start 语句放在单独的 Sub 中。对 Sub 的初次调用将失败。这使得 Try...Catch 能够在包含 Process.Start 的 Sub 启动并产生安全异常之前捕获它。

说明:

如果 Try 语句不包含至少一个 Catch 块,它必须包含 Finally 块。

示例

下面简化的示例阐释了 Try...Catch...Finally 语句的结构。

Public Sub TryExample()
    Dim x As Integer = 5   ' Declare variables.
    Dim y As Integer = 0
    Try                    ' Set up structured error handling.
        x = x \ y          ' Cause a "Divide by Zero" error.
    Catch ex As Exception When y = 0        ' Catch the error.
        Beep()
        MsgBox("You tried to divide by 0.") ' Show an explanatory message.
    Finally
        Beep()             ' This line is executed no matter what.
    End Try
End Sub

请参见

参考

End 语句

Err 对象 (Visual Basic)

Exit 语句 (Visual Basic)

On Error 语句 (Visual Basic)

Exception

GoTo 语句