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块来忽略异常并再次尝试,它将不会再正常运行 - 为每个异常抛出异常循环。必须有一些质的变化。
如果它在调试模式下工作,但在发布模式下失败,我猜测编译器会优化你的代码,使其中断。我会使用反编译功能(如dotPeek)查看生成的优化代码。 – Icemanind
@Icemanind谢谢,但我宁愿放弃我的项目,如果我只是为了调试而学习ASM。任何有形的建议? –
MSHTML不能有错误,它不包含任何代码。它只是一个互操作程序集,用于访问Web浏览器的DOM。任何事情都可能发生在网页浏览器中,您正在访问网页的Javascript可能与之混淆的DOM元素。是的,最好放弃。 –