# 问题解决

本文档记录了一些常见的使用问题,如果您在使用OpenEX最新版本中发现了异常.请递交到

GitHub Issues (opens new window)

# 编译型错误

一旦您的脚本发生编译异常,您会看到控制台打印出以下信息

这里以一个具有语法错误的脚本为例





 

include "system";

value a = 12;

system.print(b);
1
2
3
4
5

openex启动后会输出以下结果

Compile Error: Unable to resolve symbols.
    Token: b
    Line: 5
    Filename: script.exf
    Edition: OpenEX Pro
    Version: v0.1.4
Location:
    system.print(b);
                 ^
1
2
3
4
5
6
7
8
9

# 对照表

以下是所有编译型错误对照表

代号 名称 说明
need.lr.b 需要 '}' 请检查括号是否完整
need.lp.b 需要 '{' 请检查括号是否完整
need.lr.s 需要 '(' 请检查括号是否完整
need.lp.s 需要 ')' 请检查括号是否完整
need.sem.marks 需要 '"' 请检查引号是否完整
need.sem.call 需要'.' 请检查函数调用是否缺少符号
need.statement.catch 需要'catch' 请检查try语句是否有对应的catch语句
miss.function.body 缺少函数体 function定义的函数没有代码体
miss.statement.body 缺少语句体 if while for try等语句没有代码体
type.not.valid 类型名称无效 请检查函数或变量名是否由是标识符类型字段
unable.resolve.symbols 无法解析符号 请检查变量是否定义或是否导入运行时库
not.statement 不是语句 请检查语句是否完整
illegal.expression.start 非法的表达式开头 请检查表达式是否正确
illegal.expression.comb 非法的表达式组合 请检查表达式是否正确
illegal.string.escape 非法的转义字符 请检查字符串中的转义字符是否正确
illegal.key 非法的关键字 变量初始值出现非法关键字
outside.function.return 返回语句位于函数外部 return语句定义在函数体外部
outside.loop.back 退出语句位于循环外部 break语句定义在循环体外部

# 运行时错误

通常这种错误语句的组合是合法的,无法由前端编译器解析出来.但是在运行时会发生异常

这里以一个具有运行时错误的脚本为例





 

include "system";

value ary = [1,2,3];

system.print(ary[3]);
1
2
3
4
5

openex 启动后会输出以下结果

ScriptRuntimeError: Array index out of bounds,length(index:3),index(index:3)
	ThreadName: main
	FileName: main.exf
	Exception: INDEX_OUT_OF_BOUND_EXCEPTION
	Edition: OpenEX Pro
	Version: v0.1.2
Call stack struct:
	at <main.exf>: loader.boot(Script Loader)
	at <main.exf>: array.get_object(Runtime Function)
1
2
3
4
5
6
7
8
9

运行时错误会输出脚本调用栈,通常会夹带每个栈帧的类型

  • Script Loader 非用户创建, 是执行引擎执行用户脚本用的加载器函数
  • User Script 由用户创建的脚本函数
  • Runtime Function 运行库实现函数,非脚本用户创建. 由运行时本身或外部扩展实现

# 对照表

以下是所有运行时异常

catch : 是否可以被 try-catch 语句处理

名称 描述 catch
VM_ERROR 运行时内部发生错误 NO
VM_OP_STACK_ERROR 栈帧的操作栈发生异常 NO
NULL_PRINT_EXCEPTION 空指针异常 YES
INDEX_OUT_OF_BOUNDS_EXCEPTION 索引越界异常 YES
ILLEGAL_ACCESS_EXCEPTION 非法参数异常 YES
FILE_IO_EXCEPTION 文件I/O操作异常 YES
NO_SUCH_FUNCTION_EXCEPTION 找不到函数异常 YES
TYPE_CAST_EXCEPTION 类型转换发生异常 YES
NO_SUCH_VALUE_ERROR 找不到变量错误 NO

冷知识

OpenEX Pro 系列中 v0.1.1 版本及以下都是没有异常报错类型和调用栈输出的,被取而代之之前是直接打印出JVM调用栈结构