在崩溃之前没有时间进行错误检查

时间:2015-07-12 08:35:20

标签: vb.net

当使用HtmlAgilityPack时,我的代码在我可以执行任何类型的检查之前发出错误的错误,例如:

                Dim doc = New HtmlDocument()
                doc.LoadHtml(sl)
                Dim searchId = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value").Value

点击此行(工作正常后)

                Dim searchId = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value").Value

我得到的对象没有设置为引用,我知道它是因为它没有在html代码中看到这个值,我不确定检查它的最佳方法是&# 39; t为空,所以我可以继续执行,否则应用程序崩溃。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您的失败行包含多个属性查找,为清晰起见,这里将其分开::

Dim searchId = doc
                .DocumentNode
                .SelectSingleNode("//input[@name='searchId']")
                .Attributes("value")
                .Value

如果这些查找中的任何一个(.Value除外)为空,您将收到您描述的错误。例如,如果没有匹配的@name='searchId'元素,.Attributes调用将抛出错误。

为了防止出现错误,您需要在尝试下一次查找之前单独检查每个结果doc.DocumentNode不太可能是Nothing(假设您的文档有效且正确加载),所以类似这样的内容:

Dim searchId As String
If doc.DocumentNode.SelectSingleNode("//input[@name='searchId']") IsNot Nothing Then
    If doc.DocumentNode.SelectSingleNode("//input[@name='searchId']").Attributes("value") IsNot Nothing Then
        searchId = singleNode.Attributes("value").Value
    End If
End If

您可以使用短路If运算符缩短代码并阻止嵌套AndAlso。我还添加了一个临时变量以便于阅读:

Dim searchId As String
Dim idNode = doc.DocumentNode.SelectSingleNode("//input[@name='searchId']")

If idNode IsNot Nothing AndAlso idNode.Attributes("value") IsNot Nothing Then
    searchId = idNode.Attributes("value").Value
End If