MSHTML汇编

时间:2017-10-17 13:00:42

标签: vb.net mshtml

 Dim u As UInteger = 0
 Try
 Do
 u += 1
 j = DirectCast(o.item(d), HTMLTableRow).cells
 Loop
 Catch ex As Exception
 MsgBox("Access No." & u & " throws:" & ex.GetType.ToString & ":" & ex.Message)
 End Try

这是我用作测试的一段代码 - 一个死循环,无限访问变量O(之前在代码中分配)并通过一些操作将其分配给变量J(O和J都是MSHTML.IHTMLElementCollection类型)。在调试模式下,我可以正常运行,直到计数器u达到其上限。但是,在释放模式下,循环后5000~6000次(在每个测试中数字不同),它将抛出" NullReferenceException"。请注意,我刚访问过O,从未更改过,为什么会出现异常?这是汇编的MSHTML的错误吗?而且,如果我做了一个小改动:

 Dim u As UInteger = 0, v As Object
 Try
 Do
 u += 1
 v = DirectCast(o.item(d), HTMLTableRow)
 Loop
 Catch ex As Exception
 MsgBox("Access No." & u & "throws:" & ex.GetType.ToString & ":" & ex.Message)
 End Try

也就是说,删除" .cells",然后就不会有例外。这里发生了什么? (这不能用作解决方法,因为在我的程序中必须访问" .cells") 如果我使用TryCatch块忽略异常并再次尝试,它将不再正常运行 - 为每个循环抛出异常。必须有一些质的变化。

1 个答案:

答案 0 :(得分:0)

好的,MSHTML,你赢了。我必须使用最愚蠢的解决方法。试试......抓住异常并再试一次。经过多次测试后,我得到了以下可能必须处理的异常: COMException,当您可以简单地尝试再次抛出此语句时。 UnauthorizedAccessException,当你可以像上一个一样再试一次。 NullReferenceException,当你不能再简单地再试一次,因为你将再次捕获相同的异常。您必须初始化新的HTMLDocument并重新加载URL,然后执行剩余的工作。 希望任何人都能拥有更优雅的解决方案。我发誓,如果可能的话,我永远不会使用这个丑陋的大会。