按键精灵脚本开发中,运行时错误是最容易出现、也最影响脚本稳定性的问题。很多时候脚本能正常通过语法检查,但一运行就弹出错误提示,让人摸不着头脑。
本文基于官方文档,整理了6 类高频运行时错误,包含错误现象、原因分析、代码示例与一键修复方案,帮你快速定位并解决问题。
错误示例1:函数参数类型错误
Dim tableA = {"k1", "v1", "k2", "v2"}, stringA = "searchStr"
TracePrint InStr(1, tableA, stringA)
错误信息:
发生运行时错误!错误代码:2,错误行号:2,
错误信息: bad argument #1 to 'LuaAuxLib' (string expected, got table)
错误原因:
第2行调用 InStr 函数时,第二个参数传入了一个 table 类型,但函数期望的是 string 类型。
bad argument #1:表示函数的第二个参数(参数序号从0开始)有误。expected:期望的参数类型。got:实际传入的参数类型。
解决办法:
查阅函数文档,确认参数类型要求,并在传参前进行类型和空值检查,避免传入错误类型或 null 值。
错误示例2:对空值进行索引操作
Dim tableA = null
TracePrint tableA["k1"]
错误信息:
发生运行时错误!错误代码:2,错误行号:2,
错误信息: attempt to index global 'id5441424c4541' (a null value)
错误原因:
尝试对 null 值进行索引操作,导致运行时报错。错误中的变量名为编译后的标识,需要根据行号定位原始代码。
解决办法:
在访问前对变量进行判空处理:
Dim tableA = null
If tableA <> null Then
TracePrint tableA["k1"]
Else
TracePrint "tableA is null"
End If
错误示例3:对布尔类型数据进行连接操作
Dim stringA = "stringA",boolA = true
TracePrint stringA & boolA
错误信息:
发生运行时错误!错误代码:2,错误行号:2,
错误信息: attempt to concatenate global 'id424f4f4c41' (a boolean value)
错误原因:
尝试将string或number类型数据与bool类型直接拼接。
解决办法:
将bool类型转为string或number类型后再进行连接:
Dim stringA = "stringA",boolA = true
TracePrint stringA & cstr(boolA)
TracePrint stringA & cint(boolA)
错误示例4:对字符串类型数据执行算术运算
Dim stringA = "1",stringB = "stringB",boolA = true,numberA = 10
TracePrint numberA - boolA
TracePrint numberA - stringA
TracePrint numberA - stringB
错误信息:
发生运行时错误!错误代码:2,错误行号:4,
错误信息: attempt to perform arithmetic on global 'id535452494e4742' (a string value)
错误原因:
尝试将string类型数据与number或bool类型数据直接进行算术运算。
在执行算术运算前,按键会自行尝试将数据转为number类型,故代码第2、3行能够正常计算出结果
解决办法:
在执行算术运算前判断数据是否为number:
Dim stringA = "1",stringB = "stringB",boolA = true,numberA = 10
TracePrint numberA - boolA
TracePrint numberA - stringA
If IsNumeric(stringB) Then
TracePrint numberA - stringB
Else
TracePrint cstr(stringB) & " is not number"
End If
错误示例5:调用不支持的系统函数
//在安卓系统中运行:
Dim result, selector
selector = {"type": "UITableViewCellContentView"}
result = iOSElement.Finds(selector)
错误信息:
发生运行时错误!错误代码:2,错误行号:4,
错误信息: attempt to call global 'LuaAuxLib' (a null value)
错误原因:
当前系统环境(安卓)不支持调用 iOSElement.Finds 函数,该函数仅在 iOS 系统的新版引擎(v2.3.0及以上)中可用。
解决办法:
查阅函数文档,确认平台兼容性与引擎版本要求,避免在不支持的平台上调用特定 API。
错误示例6:goto跳转穿越变量定义
funA
Function funA()
For i = 1 To 10
TracePrint i
If i = 3 Then
goto rem1
End If
Next
Dim ret
Rem rem1
TracePrint "rem1"
End Function
错误信息:
第6行:外部错误:<goto id46554e413a52454d31> at line 6。错误码=13
错误原因:
在函数内部使用 goto 跳转时,不能跨越任何变量定义语句(如 Dim)。否则会引发运行错误。
解决办法:
将所有变量定义提前至函数最开始的位置:
funA
Function funA()
Dim ret
For i = 1 To 10
TracePrint i
If i = 3 Then
goto rem1
End If
Next
Rem rem1
TracePrint "rem1"
End Function
脚本防错通用规范
-
变量先判空再使用 :数组、对象、返回值必须先判断
<> null; -
类型转换先做再运算:字符串转数字、布尔转字符串;
-
函数参数严格对类型:字符串函数不传 table,算术运算不用文本;
-
平台先查兼容性:iOS / 安卓 / PC 函数分开调用;
-
Goto 尽量少用:必须用则保证不穿过 Dim、If、For 等结构。
以上 6 类错误覆盖了50% 以上按键精灵运行时崩溃场景。记住核心原则:类型要匹配、空值要判断、平台要区分、变量要前置,就能大幅减少脚本报错。