诊断码一旦发布,含义不再改变,新增只在末尾追加。
| 码 | 含义 | 示例 |
|---|---|---|
CN0101 |
非法字符 | 设 x = 1 @ 2 |
CN0102 |
未闭合字符串 | 令 s = "没闭合 |
CN0103 |
非法数字 | 123abc |
| 码 | 含义 | 示例 |
|---|---|---|
CN0201 |
期望某词元 | 令 = 1(缺变量名) |
CN0202 |
意外词元 | 设 x = 1 2 |
CN0203 |
期望表达式 | 令 x = |
CN0204 |
期望缩进块 | 如果 真 后没有缩进 |
| 码 | 含义 | 检查时机 | 示例 |
|---|---|---|---|
CN0301 |
条件必须是布尔 | 静态 + 运行时 | 如果 0 |
CN0302 |
未声明变量 | 静态 + 运行时 | 打印(没这个) |
CN0303 |
类型不匹配 | 运行时 | "字" + 1 |
CN0304 |
除以零 | 静态(字面量)+ 运行时 | 1 / 0 |
CN0305 |
不可调用 | 运行时 | 设 x = 1 后 x(1) |
CN0306 |
实参数量不符 | 运行时 | f(1, 2) 但 f 只要一个参数 |
CN0307 |
重复声明 | 静态 + 运行时 | 设 x = 1 两次 |
CN0308 |
下标越界 / 缺标签 | 运行时 | [1,2][5]、字典缺标签 |
CN0309 |
不可遍历 | 运行时 | 遍历 42 每个 x |
CN0310 |
输入已结束 | 运行时 | 询问数值() 但没有更多输入 |
CN0311 |
主动抛出(未捕获) | 运行时 | 抛出 "错" 但没有 捕获 接住 |
| 码 | 含义 | 说明 |
|---|---|---|
CN9001 |
调用的 Python 库出错 | 这是库的错,不是 CNplus 的错,会准确指向出错行 |
标「静态」的码在 cnp 检查 和编辑器里就能报出,不需要执行程序。这对编辑器体验至关重要——编辑器不会跑你的代码。
静态检查的原则是只报能百分百确定的错:
令 x = 0
如果 x # 静态不报(x 的值静态不可知),运行时报 CN0301
如果 0 # 静态就报 CN0301
宁可漏报也不误报——编辑器里的假阳性比漏报更烦人。