HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0309
masarugosub実行中にonerror gosubが重なった場合3解決


masaru

リンク

2012/3/9(Fri) 01:07:07|NO.45291


; gosub実行中のonerror gosubに関する検証 onerror gosub *error_routine gosub *sub_routine stop *sub_routine picload "gomi.jpg" ; 壊れている、もしくは存在しない画像ファイル return *error_routine if err == 13 : return ; 画像読み込みのエラーならば無視してreturn dialog "エラーコード=" + err end

上記の検証プログラムを私の環境で実行すると、エラー10が発生します。
gosubでサブルーチンに飛んでいる最中に、エラーでonerrorのgosubが実行されreturnで復帰した場合、
元のgosubに対するreturnでエラー10が発生するようです。

いろいろ試してみたところ、#deffuncで定義した命令を実行中のonerror gosubでも同様に、
#deffuncに対するreturnがエラー10扱いになってしまいます。

これは仕様なのでしょうか?
何か回避する方法はありますか?

よろしくお願いいたします。


/* onerrorの使い方として美しくない、という御批判も御座いましょうが…
「フォルダ内にある大量のJPEG画像(破損ファイル含む)を片っ端から読み込んで、
破損ファイルはスキップし、読み込めた画像だけ処理」というプログラムを組んでいる途中で
この問題にぶち当たりました。
そもそもpicloadの読み込み失敗で強制終了という仕様が謎です。stat=1で良いのでは…?*/



この記事に返信する


ヂオン

リンク

2012/3/9(Fri) 05:52:56|NO.45292

onerror には gosub を 指定しない方が良いような気がしました。

それと、ファイルをロードする際は、
exist で ファイルの有無を確認すべきです。

こだわるのなら、ファイルフォーマット ビットマップ 等でweb検索して、
それぞれ比較するのもよいかもしれません。 

一番いいのは、picload 命令が 読み込みが失敗した際に、errorを返す事だと思いますが。


; gosub実行中のonerror gosubに関する検証 #define pic_filename "gomi.jpg" onerror *error_routine gosub *sub_routine stop *sub_routine exist pic_filename if(strsize!=-1){ if(/*それが画像ファイルか、否かの比較式*/1):picload pic_filename } return *error_routine // 無視してはいけません。終了すべきです。 if err == 13 : end ; 画像読み込みのエラーならば無視してreturn dialog "エラーコード=" + err end



HK2

リンク

2012/3/9(Fri) 17:14:59|NO.45305

onerrorでサブルーチンジャンプをすると、sublevの値は1になります。

これはどうやらエラーが発生すると、呼び出し元(戻り先)情報が破棄され、
破棄された後にエラー発生時のラベルにサブルーチンジャンプをするためだと思います。

onerrorでのgosubキーワードの指定は意味がないものです。



masaru

リンク

2012/3/10(Sat) 21:38:26|NO.45355

回答ありがとうございました。
表題の件については、gosubに変な期待はせず、エラー発生時は速やかにendさせるべし、ということで納得しました。
picloadについては、picload前にバイナリチェックを入れる等の工夫を試みてみることにします。



ONION software Copyright 1997-2023(c) All rights reserved.