パースエラーの読み方
湊はスクリプトの読み込み時にエラーを検出すると、 起動時のセリフとしてエラーメッセージを表示します。
エラーメッセージの形式
パースエラー:
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 | エラー |
未定義のトーク・関数の call | notice |
エラーレベルのものが1つでもあると、ゴースト全体が読み込みに失敗した状態になります。
SSPからのDLLの読み込み自体は成功し、OnBoot のときにエラーの内容が表示されますが、それ以降のイベントには何も返さなくなります(このとき save.json は上書きされません)。
noticeレベルの場合は通常どおり動作します。内容は debug_log = true のときにログに記録されます。
実行中の警告と通知
パースや静的チェックを通ったあとも、トークの実行中に問題が見つかることがあります。
湊はこうした問題では処理を止めず、SSPへの応答の ErrorLevel / ErrorDescription ヘッダに内容を載せます。
複数あるときは、区切り文字でつないで1つのヘッダに入れます。
SSPがこれをどう表示するかは、SSPのバージョンや設定によります。
ErrorLevel には、error、warning、notice のどれかが入ります。主な例は次のとおりです。
| 状況 | 結果 | レベル |
|---|---|---|
配列の範囲外の添字(a[3]) | null | warning |
| 配列でもマップでもない値への添字アクセス | null | warning |
配列の範囲外の添字への代入(a[3] = 1) | 代入されない | warning |
マップに存在しないキーの参照(m["zz"]) | null | notice |
ゼロ除算(/、%) | null | warning |
| ループが上限(2000回)に達した | ループを打ち切る | warning |
saori() が1イベントの外部呼び出し上限(get_property() と合わせて10回)を超えた | 空の配列を返す | warning |
call したトークの候補が、すべて if(...) で除外された | 何も出力されない | notice |
saori() やファイル関数の失敗 | 空の値や false | warning / 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 ヘッダにも全件が載ります。
上から順に直していくと効率的です。