WebBrowserで表示した、あるサイトのID属性の有無を調べてるのですが
WebBrowser1_DocumentCompleted 時に以下の命令を行うとerrormessage1が存在してる場合はいいのですが、errormessage1が存在してない場合、何故か
最初のIFで抜けてしまいます。
この理由がわからず困ってます。
If WebBrowser1.Document.GetElementById("errormessage1").Children.Count > 0 Then
MsgBox("error1")
elseIf WebBrowser1.Document.GetElementById("errormessage1").Children.Count > 0 Then
MsgBox("error2")
Else
MsgBox("OK")
End If
環境VB2005です
よろしくお願いします。
エラー処理の為に、それら If 〜 End If を、Try ブロックに入れてみれば、
Catch ブロックに引っかかるかと思いますよ。
> errormessage1が存在してない場合
GetElementById の戻り値を見て、存在チェックを行いましょう。
> 最初のIFで抜けてしまいます。
errormessage1 が無い場合、GetElementById が Nothing になりますから
その後の Children プロパティにアクセスしようとした段階で、
NullReferenceException が発生します。
で、[デバッグ]-[例外]の設定を変更しない限りは、DocumentCompleted 内の
ハンドルされていない例外が拾われないので、1 行目で処理が中断されて
いるかのように見えていたのでは無いかと。
ご返答頂きありがとうございました。
Try
Dim error1 As Object = WebBrowser1.Document.GetElementById("errormessage1").InnerHtml
Catch ex As NullReferenceException
'errormessage1 が無い場合の処理
MsgBox("errormessage1が無い場合の処理")
Exit Sub
End Try
'errormessage1があった場合の処理
MsgBox("errormessage1があった場合の処理")
エラーから先に処理するのでちょっと変ですが
一先ず出来ましたのでご報告します。
errormessage1が複数あった場合は苦労すると思いますが
エラーの理由がわかったので、なんとかなりそうです。
この度はありがとうございました。
>>errormessage1が複数あった場合は苦労すると思いますが
↑↑↑↑
訂正です
errormessage1、errormessage2と複数あった場合は苦労すると思いますが
そういう事ではなく、元の
> If WebBrowser1.Document.GetElementByID("errormessage1").Children.Count > 0 Then
> MsgBox("error1")
> Else
というコードを、たとえば
x = WebBrowser1.Document.GetElementById("errormessage1")
If x Is Nothing Then
MsgBox("error0") 'errormessage1 が無い場合
ElseIf x.Children.Count > 0 Then
MsgBox("error1") 'errormessage1 があるが、子要素が無い場合
Else
のように変更しましょう、という話です。
NullReferenceException の発生有無で処理すべきではありません。
Catch するように書いたのは、あくまでも問題を把握するための「実験コード」としての意味です。
やはりエラーから処理するのは止めた方がいいのですね。
勉強になります。
わざわざコードまで書いて頂きありがとうございました。
この度は助かりました。有難うございました。