2017-10-17 309 views
0
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

如果它在调试模式下工作,但在发布模式下失败,我猜测编译器会优化你的代码,使其中断。我会使用反编译功能(如dotPeek)查看生成的优化代码。 – Icemanind

+0

@Icemanind谢谢,但我宁愿放弃我的项目,如果我只是为了调试而学习ASM。任何有形的建议? –

+0

MSHTML不能有错误,它不包含任何代码。它只是一个互操作程序集,用于访问Web浏览器的DOM。任何事情都可能发生在网页浏览器中,您正在访问网页的Javascript可能与之混淆的DOM元素。是的,最好放弃。 –

回答

0

OK,MSHTML,you win。我必须使用最愚蠢的解决方法。试试......赶上例外情况,然后重试。经过多次测试后,我得到了以下可能的必须处理的异常: COMException,当您可以简单地尝试再次抛出该语句时。 UnauthorizedAccessException,当你可以简单地再次尝试像最后一个。 NullReferenceException,当你不能再试一次,因为你会再次捕获相同的异常。您必须初始化一个新的HTMLDocument并重新加载URL,然后完成剩余的工作。 想要更优雅的解决方案的任何人。我发誓,如果可能的话,我永远不会使用可怕的大会。