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