错误码总表
SML 的每类错误都有稳定的机器可读码,形如 E-CONTRACT-002:
- 第 1 段是级别:
E错误 /W告警 /I提示 - 第 2 段是领域,共 14 个,按层分:语言层(词法、语法、契约、include、上限、特性、扩展点)、 宿主绑定层(IO、内部、派生桥)、工具层(迁入格式、命令行、lint)、编辑器层(编辑器宿主)
- 第 3 段是序号,三位、只增不改;删掉的码留空位,不回收
码是稳定契约,文案不是。 各语言实现的报错措辞可以不同(甚至不同语言),只要码相同就是同一件事: 用码去判断、去检索、去写文档;不要用文案去匹配。
权威数据源是仓库里的
errors/codes.sml, 本页的表格由python errors/gen_json.py从它生成 —— 也就是说这一页与代码引用的是同一份事实, 不会出现「文档里有的码代码里没有」。当前共 141 条码。
码表回答的是「有哪些码」;实现是否真的会报出这个码是另一件事,进度见仓库
errors/README.md 的
「码的落地进度」。目前五端(Rust / JS / C / C++ / Lua)与命令行工具 smltools 均已全量带码,
各端都有一份「触发条件 → 期望码」的用例,同一条件在五端报同一个码。
带来的一类可见变化:此前「静默通过」的输入现在都带码报错(不再悄悄给一棵错树)——
未闭合字符串 E-LEX-001、未闭合块注释 E-LEX-002 / E-LEX-003、未知转义 E-LEX-004、
非法 \u E-LEX-005、数组里多余的 } E-PARSE-003、闭合符错配 E-PARSE-002、
未注册指令 E-PARSE-005、未定义片段引用 E-INCLUDE-006、顶层标量 E-PARSE-008。
本轮新增的码里有 E-INCLUDE-012(include 路径写法非法)与 E-CLI-008(smltools 命令行用法错误)。
(⚠️ 2026-09-19:E-INCLUDE-012 已升为语言级规则 —— 判据在 sml-include,因此
Rust(含 smltools)与 Lua 都抛;下表的 impls 即以码表为准。)
正在加载错误码表……(若长时间无内容,说明 errors.json 未生成:
先跑 python errors/gen_json.py)
怎么用
E-CONTRACT-002 字段类型不符
E-PARSE-008 顶层标量不可往返
E-LIMIT-001 嵌套过深
- 本页检索框支持通配:
E-CONTRACT-*、E-*-008(只对码本身做全匹配); 普通关键词(「契约」「嵌套」)仍走全字段子串 - 每张卡片都可深链:
/errors/#E-PARSE-008打开后自动填进检索框、把该条高亮并滚进视野 (#E-*-008这类通配 hash 同样可用);点卡片上的码,地址栏就变成这条的可分享链接 - 教科书
/search也能按码检索:查询「看起来像码」时会额外列出错误码命中, 并深链回本页/errors/#码 - 写脚本判断错误类别时,匹配前两段往往比匹配整码更合适(如所有契约错误都是
E-CONTRACT-*) - 报 bug 时请带上码 + 最小复现,比贴一大段文案有用得多
- 想加新码?改
errors/codes.sml,序号只增;文案可以随便改,码不行。 改完跑两个生成器:python errors/gen_json.py(本页数据)与python errors/gen_codes.py(各端常量,并反向校验源码里手写的码都在表里)