2017-10-17 6 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 

Ceci est le morceau de code I utilisé comme test - une boucle morte, l'accès à l'infini O variable (affectées code avant) et l'affecter à la variable J avec une opération (O et J sont tous les deux le type MSHTML.IHTMLElementCollection). En mode débogage, je peux l'exécuter normalement jusqu'à ce que le compteur atteigne sa limite supérieure. Cependant, sous le mode de libération, après la boucle pour 5000 ~ 6000 fois (dans chaque test, le nombre est différent), il lancera "NullReferenceException". Notez que je viens d'accéder à O, je ne l'ai jamais changé, pourquoi est-ce l'exception? Est-ce un bug de MSHTML l'assemblée? De plus, si je fais un changement mineur:bug étrange à l'Assemblée 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 

C'est, pour enlever les « .cells », et il n'y aura pas d'exceptions. Que se passe t-il ici? (Cela ne peut pas être utilisé comme une solution de contournement car le programme ".cells" doit être accédé) Si j'utilise TryCatch block pour ignorer l'exception et réessayer, il ne fonctionnera plus normalement - en levant l'exception pour chaque boucle. Il doit y avoir des changements qualitatifs.

+0

Si cela fonctionne en mode débogage, mais échoue en mode de publication, je suppose que le compilateur optimise votre code de manière à ce qu'il casse. J'utiliserais une décompilation prise, comme dotPeek, pour regarder le code d'optimisation généré. – Icemanind

+0

@Icemanind Merci, mais je préfère abandonner mon projet si je dois apprendre l'ASM juste pour le débogage. Des conseils tangibles? –

+0

MSHTML ne peut pas avoir de bogue, il ne contient aucun code. C'est juste un assembly interop pour accéder au DOM d'un navigateur web. Tout et n'importe quoi peut se produire dans un navigateur Web, vous accédez à des éléments DOM avec lesquels le Javascript d'une page Web peut aussi être en train de jouer. Oui, mieux vaut abandonner. –

Répondre

0

OK, MSHTML, vous gagnez. Je dois utiliser la solution de contournement la plus stupide. Essayez ... attrapez l'exception et réessayez. Après de nombreux tests, j'ai obtenu les exceptions possibles suivantes qui doivent être traitées: COMException, quand vous pouvez simplement essayer l'instruction en lançant ceci à nouveau. UnauthorizedAccessException, lorsque vous pouvez simplement réessayer comme le dernier. NullReferenceException, lorsque vous NE POUVEZ PAS simplement réessayer car vous rencontrerez à nouveau la même exception. Vous devrez initialiser un nouveau HTMLDocument et recharger l'URL, puis effectuer le travail restant. Vouloir quelqu'un avec une solution plus élégante. Je jure que je n'utiliserai jamais l'Assemblée hideuse si possible.