パースエラーの読み方

湊はスクリプトの読み込み時にエラーを検出すると、 起動時のセリフとしてエラーメッセージを表示します。

エラーメッセージの形式

パースエラー:
main.mntの3行目(OnBoot内): ループの外で break を使っています
sub.mntの9行目(OnClose内): ループの外で continue を使っています

1件ごとに ファイル名の行番号行目: メッセージ の形式で表示されます。 include したファイルで起きたエラーには、そのファイルの名前が付きます。 静的チェックのエラーには、(OnClose内) のように、どのトーク・関数の中かが付きます。 直し方の手がかりがあるときは、次の行に ヒント: が続きます。

パースエラー:
main.mntの1行目: 1行目の「{」が閉じられていません
ヒント: 対応する「}」を書いてください

{ の閉じ忘れは、ファイルの末尾ではなく、閉じられていない { を開いた行で報告されます。 閉じられていない { が複数あるときは、最後に開いたもの(いちばん内側)を報告します。

それ以外のエラーで指摘される行は、湊が間違いに気づいた位置です。指摘された行で原因が見つからないときは、その少し前も確認してください。

デバッグログ

config.toml で debug_log = true にすると minato_load.log により詳細な情報が記録されます。

[settings]
debug_log = true

2回目以降の起動では save.json の system.debug_log が config.toml より優先されます。 詳しくは設定(config.toml)を参照してください。

静的チェック

パースが成功した後、以下のチェックが行われます。

チェック内容レベル
ループの外での break / continueエラー
未定義のトーク・関数の callnotice

エラーレベルのものが1つでもあると、ゴースト全体が読み込みに失敗した状態になります。 SSPからのDLLの読み込み自体は成功し、OnBoot のときにエラーの内容が表示されますが、それ以降のイベントには何も返さなくなります(このとき save.json は上書きされません)。 noticeレベルの場合は通常どおり動作します。内容は debug_log = true のときにログに記録されます。

実行中の警告と通知

パースや静的チェックを通ったあとも、トークの実行中に問題が見つかることがあります。 湊はこうした問題では処理を止めず、SSPへの応答の ErrorLevel / ErrorDescription ヘッダに内容を載せます。 複数あるときは、区切り文字でつないで1つのヘッダに入れます。 SSPがこれをどう表示するかは、SSPのバージョンや設定によります。

ErrorLevel には、error、warning、notice のどれかが入ります。主な例は次のとおりです。

状況結果レベル
配列の範囲外の添字(a[3])nullwarning
配列でもマップでもない値への添字アクセスnullwarning
配列の範囲外の添字への代入(a[3] = 1)代入されないwarning
マップに存在しないキーの参照(m["zz"])nullnotice
ゼロ除算(/、%)nullwarning
ループが上限(2000回)に達したループを打ち切るwarning
saori() が1イベントの外部呼び出し上限(get_property() と合わせて10回)を超えた空の配列を返すwarning
call したトークの候補が、すべて if(...) で除外された何も出力されないnotice
saori() やファイル関数の失敗空の値や falsewarning / error
  • 未定義の変数を ${x} で参照しても、空文字列になるだけで、警告も通知も出ません。書き間違いに気づきにくいので注意してください。
  • トークの if(...) 条件の評価中に出た警告と通知は、選ばれなかったトークの条件が原因のことが多いため、記録されません(error レベルだけは記録されます)。
  • トークが選ばれたのに出力が空だったときは、SSPには何も返さず(204)、「出力が空でした」という notice が記録されます。この notice が応答に載るのは、debug_log = true のときだけです。
  • ゴーストの読み込み時に見つかった問題(台本の一番上にある global 文のエラーなど)は、最初のイベントへの応答に、一度だけ載ります。

ログに残したい内容がある場合は、config.toml の debug_log = true を設定し、台本から log() を使うこともできます(ビルトイン関数)。

複数のエラー

エラーはファイル名・行番号の順に並びます。 吹き出しには最初の3件までを表示し、残りは「他n件(minato_check で全件を確認できます)」とまとめます。 全件は minato_check で確認できます。SSPへの応答の ErrorDescription ヘッダにも全件が載ります。 上から順に直していくと効率的です。