1

我有一个在运行时创建并通过后台线程使用的 webbrowser 控件。以下是使用的代码示例:

If Me.InvokeRequired Then Me.Invoke(Sub() webbroswers(3).Document.GetElementById("ID").InnerText = TextBox4.Text)

这很好用!但有时网络浏览器没有元素“ID”(例如)。所以我想要一种方法,如果发生错误,基本上可以让代码继续运行。我已经尝试过 try - catch 块,但这并没有捕捉到它!

4

1 回答 1

3

您可以使用多行 lambda 表达式,如下所示:

If Me.InvokeRequired Then Me.Invoke(
    Sub()
        Dim element As HtmlElement = webbroswers(3).Document.GetElementById("ID")
        If element IsNot Nothing Then
            element.InnerText = TextBox4.Text
        End If
    End Sub
    )

像这样检查它是否Nothing比让它失败并捕获异常更有效。但是,如果您出于任何其他原因需要执行 Try/Catch,您也可以在多行 lambda 表达式中轻松执行此操作,例如:

If Me.InvokeRequired Then Me.Invoke(
    Sub()
        Try
            webbroswers(3).Document.GetElementById("ID").InnerText = TextBox4.Text
        Catch ex As Exception
            ' ...
        End Try
    End Sub
    )

但是,如果 lambda 表达式太长,或者您希望在异常中具有更有意义的堆栈跟踪,则可以使用委托给实际方法,如下所示:

    If Me.InvokeRequired Then Me.Invoke(AddressOf UpdateId)

'...

Private Sub UpdateId()
    Try
        webbroswers(3).Document.GetElementById("ID").InnerText = TextBox4.Text
    Catch ex As Exception
        ' ...
    End Try
End Sub
于 2013-11-12T00:59:24.120 回答