如何处理跨线程操作中的错误

时间:2013-11-12 00:37:57

标签: vb.net multithreading error-handling webbrowser-control

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

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

这很棒!但有时webbrowser没有元素“ID”(例如)。所以我想要一种基本上允许代码在发生错误时继续的方法。我已经尝试过try-catch块但是这没有抓住它!

1 个答案:

答案 0 :(得分: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