Skip to content

错误与异常

前言与确认

写代码的过程中,报错是家常便饭——连老手也天天在跟报错打交道。所以,会看报错比“从不报错”重要得多。这一节,我们来认识报错信息,并学会让程序在必要时主动“喊停”。

教程依赖

本教程假设您已学习过快速开始复合语句函数的定义与用法。若您尚未学习过,我们强烈推荐您首先学习相应教程。

先确认一下我们现有的工程文件夹结构:

root/
 ├─ emuera.config
 ├─ Emuera1824.exe
 ├─ CSV/
 └─ ERB/
     └─ System.erb

其中,System.erb的代码为:

erb
@EventFirst
  Print Hello World!
  Quit

报错信息长什么样

当脚本出问题时,Emuera 会在画面上打印一段错误信息,大致像这样:

错误信息索引

予期しないスクリプト終端です

预料之外的脚本结尾。

它一般会告诉你两件事:在哪里出错出了什么错。把这两点看明白,问题就解决了一半。

最常见的几种错误

找不到函数

错误信息索引

関数"@EVENTFIRST"が見つかりません

找不到函数 @EVENTFIRST

这通常意味着你拼错了函数名,或者忘了定义该函数。比如引擎要调用 @EVENTFIRST,而你的脚本里写的是 @EventFrist(字母顺序错了)。

缺了 ENDIF

错误信息索引

IFに対応するENDIFが設定されていない

没有与 IF 对应的 ENDIF。

复合语句讲究“成对出现”:IFENDIFREPEATRENDFORNEXT。少写一个结尾,就会报这种错。检查时可以用编辑器的括号配对/折叠功能,一眼就能看出哪一层没闭合。

类型对不上

错误信息索引

'='の前後で型が一致しません

= 的前后类型不一致。

多是把字符串塞进了数值变量(或反过来)。检查一下 #Dim 是不是该写成 #DimS,字符串有没有加引号。

访问越界

错误信息索引

配列の範囲外です

访问了数组范围之外的位置。

数组是“从 0 开始”的:A:0 是第 1 个元素。如果你写 A:10,而这个数组只有 10 个元素(可用下标 0~9),就会越界。

脚本意外结束

错误信息索引

予期しないスクリプト終端です

预料之外的脚本结尾。

多半是某个函数写了一半,或者复合语句没写完。回头看看出错位置附近,是不是少了几行。

找不到原因?去看日志

报错框旁边常会提示:

※※※ログファイルをroot/emuera.logに出力しました※※※

打开根目录下的 emuera.log,里面有更详细的记录:出错的文件名、行号、函数名等等。报错框没看明白时,日志往往能给出更多线索。

调试模式

如果错误实在难找,可以以调试模式启动 Emuera(命令行加 -debug 参数)。调试模式会提供变量查看、逐行执行等工具,能帮你一步步定位问题。

普通模式与调试模式的更多区别,可以参考调试模式

主动报错

有时候,我们希望“如果出现了不该出现的情况,就立刻停下来”。这时可以用:

  • ASSERT <表达式>:表达式为假(0)时,输出错误并停止;
  • THROW <FORM 格式文本>:直接输出一条自定义错误并停止。
erb
@EventFirst
  #Dim Money = 100
  ASSERT Money >= 0
  SIF Money < 0
    THROW 金币变成了负数:{Money}
  Quit

ASSERT 适合在开发阶段“守门”,一旦某个前提不成立就马上提醒你;THROW 则适合给出更人性化的错误说明。

小结

  • 报错信息告诉我们在哪里出了什么错
  • 常见错误:找不到函数、缺少 ENDIF、类型不一致、数组越界、脚本意外结束;
  • 看不明白时,去根目录翻 emuera.log
  • 需要更强大的排查工具时,用调试模式;
  • 可以用 ASSERT / THROW 让程序主动报错。

下一步,我们把前面学到的东西串起来,看看一个游戏是怎么“跑起来”的:内置流程

GPL-3.0+ Licensed