httploadに渡すurlに間違えて存在しないサーバーや、サーバーではない文字列を渡してしまった場合、httpinfoはHTTPMODE_ERRORを返します。その後、正しいurlをhttploadに渡しなおしてもhttpinfoは常にHTTPMODE_ERRORを返すようになってしまいます。やり方が悪いのか、エラーからの復帰ができません。
エラー発生後に復帰させるための処置方法はどのようにするのが良いのでしょうか。無効なurlはある程度、事前にチェックするとしても完全にはできないので事後処理必須です。
以下は問題を確認するためのスクリプトです。(テスト環境 HSP3.7β10)
実行すると画像が3つ表示されます。
#include "hsp3dish.as" ; 画像URLリスト ; 画像の出典:https://maps.gsi.go.jp/development/ichiran.html sdim img_urls, 128, 3 img_urls(0) = "https://cyberjapandata.gsi.go.jp/xyz/std/15/29099/12902.png" img_urls(1) = "https://cyberjapandata.gsi.go.jp/xyz/std/15/29098/12902.png" img_urls(2) = "https://cyberjapandata.gsi.go.jp/xyz/std/15/29097/12902.png" dim wid, 3 wid = 1,2,3 idLoad = 0 dim stateLoad, 3 ; 0 初期状態 ; 1 ロード中 ; 2 ロードが正常終了した ; 3 ロードが異常終了した ;------------------------------ ; エラーを起こすためのurl ;------------------------------ ; 2個目の画像のurlを正しくないものに置き換えます。 ; ①存在しないサーバーを指定した場合 ; 「リクエストができませんでした」となり、処理が継続できない。 ;img_urls(1) = "https://aaaabbbbcccc.jp/" ; ②サーバーではない文字列を渡した場合 ; 「無効なサーバーが指定されました」となり、処理が継続できない。 ;img_urls(1) = "" ; ③404の画像アドレスの場合 ; エラーにはならないので処理が継続されます。 ; 2個目の画像のみ読み込まれませんが、処理は継続されて3つ目の画像も読み込まれます。 ;img_urls(1) = "https://cyberjapandata.gsi.go.jp/xyz/std/none.png" ;------------------------------ ; メインループ ;------------------------------ *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 if idLoad < 3 { if stateLoad(idLoad) = 0 { stateLoad(idLoad) = 1 httpload img_urls(idLoad) if stat : gosub *bad } ; 結果待ちのためのループ if stateLoad(idLoad) { httpinfo res, HTTPINFO_MODE if res = HTTPMODE_NONE : logmes "" + idLoad + ":通信初期化エラー " + HTTPMODE_NONE if res = HTTPMODE_READY : logmes "" + idLoad + ":通信可能状態 " + HTTPMODE_READY if res = HTTPMODE_REQUEST : logmes "" + idLoad + ":リクエスト通信準備 " + HTTPMODE_REQUEST if res = HTTPMODE_SEND : logmes "" + idLoad + ":リクエスト送信 " + HTTPMODE_SEND if res = HTTPMODE_DATAWAIT : logmes "" + idLoad + ":通信結果待機中 " + HTTPMODE_DATAWAIT if res = HTTPMODE_DATAEND : logmes "" + idLoad + ":通信終了 " + HTTPMODE_DATAEND if res = HTTPMODE_ERROR : logmes "" + idLoad + ":エラー発生 " + HTTPMODE_ERROR if res = HTTPMODE_READY : gosub *comp if res <= HTTPMODE_NONE : gosub *bad } ; 次を読み込み if stateLoad(idLoad) >= 2 : idLoad++ } ; 画像を表示 if stateLoad(0) = 2 : pos 10, 70 : celput wid(0), 0 if stateLoad(1) = 2 : pos 50, 120 : celput wid(1), 0 if stateLoad(2) = 2 : pos 100, 170 : celput wid(2), 0 ; 読み込みの状態 pos 10, 10 repeat 3 mes "stateLoad = "+stateLoad(cnt) loop goto *main ;------------------------------ ; エラー処理 ;------------------------------ ; 「無効なサーバーが指定されました」 ; https:以外が指定された。 ; ; 「リクエストができませんでした」 ; 存在しないサーバーが指定された。 *bad stateLoad(idLoad) = 3 httpinfo estr, HTTPINFO_ERROR logmes "Error : " + estr logmes img_urls(idLoad) return ;------------------------------ ; ダウンロード完了 ;------------------------------ *comp stateLoad(idLoad) = 3 httpinfo buf,HTTPINFO_DATA httpinfo size,HTTPINFO_SIZE if size <= 0 { message = "Error:データがありません。" return } if (peek(buf, 0) ! 0x89) & (peek(buf, 1) ! 0x50) & (peek(buf, 2) ! 0x4E) { ; PNG message = "Error:画像がありません。" return } stateLoad(idLoad) = 2 ; メモリストリームで読み込む memfile buf, 0, size celload "MEM:.png", wid(idLoad) return
①、②いずれかのコメントを外すと問題が再現できます。
理想としては、③のコメントを外した場合と同様の挙動になってほしいところです。