Top > ScriptFuClass > Staying

居残り授業 エラー対策 Edit

作っている途中にスクリプトをデバッグすることは難しいです。どの部分まで正しく動いていて、どの部分から間違ったふるまいをしているのか、";" によるコメントアウトを使用して途中経過を見てみるのも一つの方法だと思います。

メッセージの出力方法 Edit

変数をメッセージ出力して中身を検証することで、予想したようにスクリプトが動いているのか確かめることができます。

(gimp-message "STRING")

gimp-message は "STRING" をメッセージ出力します。"STRING" のところは文字列である必要があります。例えば変数 NAME に文字列が入っていたとすると、NAME の中身を出力するにはこうします。

(gimp-message NAME)	; 文字列 NAME を表示する

しかし、出力したい変数は文字列だけではありません。数値の場合は、一旦文字列に変換してやらなければなりません。例えば変数 suuji に整数が入っていたとすると、suuji の中身を出力するにはこうします。

(gimp-message (number->string suuji))	; 数値 suuji を文字列に変換して表示する

number->string は数値を引数としてとり、文字列に変換する関数です。これを使うことによリ数値を文字列に変換して gimp-message で出力することができます。しかし連続してこの関数を呼び出すと警告を受けるので、繰り返しループの中などで使用する場合は注意が必要です。

よくあるエラーメッセージの例 Edit

ここでは Script-Fu を実行した時に発生しやすいエラーメッセージと、その原因について説明してあります。しかしエラーを発生させている直接の原因は別の場所にあるかもしれないことに注意しておいた方がよいでしょう。

Error: unbound variable:

これは後に続く変数名が以前に宣言されていないことを伝えています。変数名が間違っているか、変数の有効範囲内にないか、などの理由が考えられます。例えば let* で宣言していない変数を set! で使用してしまうとこのエラーが表示されます。

Error: unmatched parentheses:

これは括弧が多くあったり少なかったりしていることを表しています。余分な開き括弧や閉じ括弧がないか、もしくは開き括弧や閉じ括弧が足りているかどうかを確認しましょう。

* ERROR: Procedural database execution failed

プロシージャ実行エラーで、関数を呼び出した時に引数が足りないかタイプが間違っている可能性があります。呼び出すものが Gimp の関数の場合には DB ブラウザできちんと引数を確認しておきます。

Error: Invalid type for argument No. to hoge

関数 hoge の No. 番目の引数に指定したタイプが間違っています。引数のタイプと、関数に要求されているタイプとが一致しているか確かめましょう。

* ERROR: wta to car

wta とは wrong type argument の略で、引数のタイプが違っているというエラーです。上記の場合、car の引数が違っているという警告です。よくあるのは、car しなくてもよいタイプの関数 (の返り値) に対して car してしまってこのようなエラーになる場合です。例えば、(car "A") のように、文字列や数値に対して car を適用すしたときにこのエラーになります。

スクリプトのデバッグ方法 Edit

GIMP の Sciprt-Fu のインタプリタが TinyScheme に入れ替わった GIMP-2.4 以降から、スクリプトのトレースが可能になりました。よってインタプリタが SIOD である GIMP-2.4 以前では以下の方法は使用できません。
スクリプトのデバッグはこのトレースを使用すると問題点を見つけやすくなります。

トレース出力方法 Edit

トレースを出力する方法は簡単で、次の関数をスクリプト本文中のトレースさせたい区間の前後に追加するだけです。

トレースを開始する場合:
(tracing TRUE)

トレースを終了する場合:
(tracing FALSE)

Script-Fu コンソールでも tracing を使用できます。

このようにすると、トレースが有効になっている区間で何かエラーが起きた場合に、そのトレース結果が表示されます。
トレース結果を読み解くことは難解かもしれませんが、トレース結果を読むことで問題解決の手がかりになると思います。

Eval: では評価している様子が分かります。

Apply to: では引数に対してコードを適用しているところです。

Gives: では、評価した結果が表示されます。

しかし問題のあるスクリプトを実行してトレース結果を表示させた場合、トレース結果が膨大な量になってダイアログに表示しきれないと思います。
この場合、エラーコンソールを開いておくとトレース結果がダイアログに表示されるのではなくて、エラーコンソール内に表示してくれるので便利です。エラーコンソールは、「ウィンドウ→ドッキング可能なダイアログ→エラーコンソール」にあります。

エラーコンソールへ出力

ちょっと変わった方法としては、gimp-message-set-handler 関数を使う方法です。プロシージャブラウザからこの関数の説明を読むと分かると思いますが、通常の場合、エラーメッセージは MESSAGE-BOX になっているのでエラーダイアログがポップアップされて、そこに表示されます。これを CONSOLE に変えると stdout に出力されます。ERROR-CONSOLE はエラーコンソールです。
gimp-message-set-handler を使う場面としては、バッチモードでスクリプトを使うときでしょうか。



Diff Freeze Rename Backup   RSS of recent changes
Last-modified: (1608d)