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

이 I 테스트로서 사용 코드의 조각 및 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 블록을 사용하여 예외를 무시하고 다시 시도하면 더 이상 정상적으로 실행되지 않습니다. 각 예외를 throw합니다. 고리. 질적 인 변화가 있어야합니다.

+0

디버그 모드에서 작동하지만 릴리스 모드에서 실패하는 경우 컴파일러가 코드를 최적화하는 방식으로 코드를 최적화하는 것입니다. 생성 된 최적화 코드를보기 위해 dotPeek과 같은 decompiling 테이크를 사용할 것입니다. – Icemanind

+0

@Icemanind 고맙습니다.하지만 디버깅을 위해 ASM을 배워야한다면 프로젝트를 포기할 것입니다. 어떤 유형의 조언? –

+0

MSHTML은 버그를 가질 수 없으며 코드를 포함하지 않습니다. 웹 브라우저의 DOM에 액세스하기위한 interop 어셈블리 일뿐입니다. 웹 브라우저에서 무엇이든 모든 일이 발생할 수 있으며, 웹 페이지의 자바 스크립트가 엉망이 될 수있는 DOM 요소에 액세스하고 있습니다. 예, 포기하는 것이 가장 좋습니다. –

답변

0

좋습니다, MSHTML, 당신이 이깁니다. 나는 가장 어리석은 해결 방법을 사용해야한다. 예외를 포착하고 다시 시도하십시오. 수많은 테스트 후에 처리해야하는 다음과 같은 예외가 있습니다. COMException,이 문을 다시 던지기 만하면됩니다. UnauthorizedAccessException, 마지막 시도처럼 다시 시도 할 수 있습니다. NullReferenceException, 같은 예외를 다시 잡을 수 있기 때문에 다시 시도 할 수 없을 때. 새 HTMLDocument를 초기화하고 URL을 다시로드 한 다음 나머지 작업을 수행해야합니다. 좀 더 우아한 솔루션을 원하는 사람. 나는 가능하다면 결코 끔찍한 어셈블리를 사용하지 않을 것을 맹세한다.