KCL 错误与警告
文档的此部分中的文章介绍了由 KCL 生成的诊断错误和警告消息。
注意: KCL 可以报告多种错误和警告。找到错误或警告后,KCL 可能会对代码意向作出假设并尝试继续,以便可以同时报告更多问题。 如果工具做出错误假设,则后续错误或警告可能不适应与当前 KCL 程序。 因此,纠正项目中的问题时,请先纠正第一个错误或警告,然后重新运行获取新的错误信息。 一个修补程序可能会导致后续错误消失。
此部分文档的主要内容包括:
KCL 语法错误 (E1xxx) : 如果 KCL 在当前 KCL 程序中发现了非法的 KCL 语法,KCL 就会停止运行并输出 KCL 程序语法错误的提示信息.
KCL 编译错误 (E2xxx) : 如果 KCL 在一个不包含语法错误的 KCL 程序中发现了与 KCL 语义不符的代码,KCL 就会停止运行并输出编译错误的提示信息。
KCL 运行时错误 (E3xxx) : KCL 程序通过编译后会生成 KCL 字节码,如果 KCL 在执行 KCL 字节码过程中出现错误,KCL 就会停止运行并输出运行时错误的提示信息.
KCL 编译警告 (W2xxx) : 当 KCL 发现可能导致运行失败的 KCL 代码,KCL 不会立即停止运行,但是会输出潜在错误的警告提示。
1.1 KCL 语法错误 (E1xxx)
KCL 会出现的语法错误信息如下表所示:
ewcode | KCL exception | messages |
---|---|---|
E1001 | InvalidSyntaxError | Invalid syntax |
E1002 | KCLTabError | Tab Error |
E1003 | KCLIndentationError | Indentation Error |
E1I37 | IllegalArgumentSyntaxError | Illegal argument syntax |
1.1.1 InvalidSyntaxError [E1001]
如果在运行 KCL 时遇到错误:
InvalidSyntaxError
, 对应的 encode 为E1001
那么此时 KCL 程序中出现了
- 非法的 KCL 语法。
可能出现错误的 KCL 程序片段如下:
a, b = 1, 2 # 通过 “=” 赋值多个变量在KCL中是非法的。
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Syntax Error[E1001] : Invalid syntax
---> File /syntax_error/general/multiple_assign/case0/main.k:1:6
1 |a = 1, 2
6 ^ -> Expected one of ['newline']
Invalid syntax
1.1.2 KCLTabError [E1002]
如果在运行 KCL 时遇到错误:
KCLTabError
, 对应的 encode 为E1002
那么此时 KCL 程序中出现了
- Tab 与空格混用的问题。KCL 中禁止在代码缩进中混用 Tab 和空格。
可能出现错误的 KCL 程序片段如下:
schema Person:
name: str # 通过tab表示缩进
age: int # 通过四个空格标识缩进,
# 在当前运行环境中的四个空格与tab不同
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Syntax Error[E1002] : Tab Error
---> File /syntax_error/tab/tab_error_0/main.k:2:14
2 | name: str
14 ^ -> Failure
Inconsistent use of tabs and spaces in indentation
可以尝试以下步骤来修复这个错误:
- 在 KCL 程序中全部使用 Tab 或者全部使用四个空格,不要混用。
1.1.3 KCLIndentationError [E1003]
如果在运行 KCL 时遇到错误:
KCLIndentationError
, 对应的 encode 为E1003
那么此时 KCL 程序中出现了
- 程序缩进错误。
可能出现错误的 KCL 程序片段如下:
schema Person:
name: str # 使用一个tab或者四个空格表示缩进
age: int # KCL不支持使用三个空格表示缩进
info: str # KCL不支持使用两个空格表示缩进
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Syntax Error[E1003] : Indentation Error
---> File /syntax_error/indent/indent_error_0/main.k:2:14
2 | name: str
14 ^ -> Failure
Unindent 3 does not match any outer indentation level
可以尝试以下步骤来修复这个错误:
- 在 KCL 程序中全部使用 Tab 或者全部使用四个空格来表示缩进。
1.1.4 IllegalArgumentSyntaxError [E1I37]
如果在运行 KCL 时遇到错误:
IllegalArgumentSyntaxError
, 对应的 encode 为E1I37
那么此时 KCL 程序中出现了
- 参数语法错误
可能出现错误的 KCL 程序片段如下:
# KCL中带有keyword的参数必须出现在不带有keyword参数后面
# 带有keyword的参数: type="list", default={"key": "value"}
# 不带有keyword的参数: "key1"
a = option(type="list", default={"key": "value"}, "key1")
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Syntax Error[E1I37] : Illegal argument syntax
---> File /option/type_convert_fail_2/main.k:1:51
1 |a = option(type="list", default={"key": "value"}, "key1")
51 ^^^^^^ -> Failure
positional argument follows keyword argument
可以尝试以下步骤来修复这个错误:
- KCL 中带有 keyword 的参数必须出现在不带有 keyword 参数后面, 参数正常顺序:
func(input_1, ..., input_n,
param_with_key_1 = input_with_key_1, ..., param_with_key_n = input_with_key_n)
1.2 KCL 编译错误 (E2xxx)
KCL 会出现的编译错误信息如下表所示:
ewcode | KCL exception | messages |
---|---|---|
E2F04 | CannotFindModule | Cannot find the module |
E2F05 | FailedLoadModule | Failed to load module |
E2H13 | UnKnownDecoratorError | UnKnown decorator |
E2H14 | InvalidDecoratorTargetError | Invalid Decorator Target |
E2C15 | MixinNamingError | Illegal mixin naming |
E2C16 | MixinStructureIllegal | Illegal mixin structure |
E2B17 | CannotAddMembersComplieError | Cannot add members to a schema |
E2B20 | IndexSignatureError | Invalid index signature |
E2G22 | TypeComplieError | The type got is inconsistent with the type expected |
E2L23 | CompileError | A complie error occurs during compiling |
E2L25 | KCLNameError | Name Error |
E2L26 | KCLValueError | Value Error |
E2L27 | KCLKeyError | Key Error |
E2L28 | UniqueKeyError | Unique key error |
E2A29 | KCLAttributeComplieError | Attribute error occurs during compiling |
E2D32 | MultiInheritError | Multiple inheritance is illegal |
E2D34 | IllegalInheritError | Illegal inheritance |
E2I36 | IllegalArgumentComplieError | Illegal argument during compiling |
E3L41 | ImmutableCompileError | Immutable variable is modified |
1.2.1 CannotFindModule [E2F04]
如果在运行 KCL 时遇到错误:
CannotFindModule
, 对应的 encode 为E2F04
那么此时 KCL 程序中出现了
- 无法找到导入模块错误
可能出现错误的 KCL 程序片段如下:
import .some0.pkg1 as some00 # some0 not found in package
Name1 = some00.Name # some0.pkg1.name
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2F04] : Cannot find the module
---> File import_abs_fail_0/app-main/main.k:1:1
1 |import .some0.pkg1 as some00 # some0 not found in app-main package
1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> Failure
Cannot find the module .some0.pkg1 from import_abs_fail_0/app-main/some0/pkg1
可以尝试以下步骤来修复这个错误:
- 在 imoprt 路径下添加导入模块文件。
1.2.2 FailedLoadModule [E2F05]
如果在运行 KCL 时遇到错误:
FailedLoadModule
, 对应的 encode 为E2F05
那么此时 KCL 程序中出现了
- 导入模块加载错误
可以尝试以下步骤来修复这个错误:
- 查看文件是否可读
- 查看文件是否为 kcl 文件
1.2.3 UnKnownDecoratorError [E2H13]
如果在运行 KCL 时遇到错误:
UnKnownDecoratorError
, 对应的 encode 为E2H13
那么此时 KCL 程序中出现了
- 未知的装饰器错误
可能出现错误的 KCL 程序片段如下:
@err_deprecated # 这是一个非法的装饰器
schema Person:
firstName: str = "John"
lastName: str
name: str
JohnDoe = Person {
name: "deprecated"
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2H13] : UnKnown decorator
---> File deprecated/unknown_fail_1/main.k:1:2
1 |@err_deprecated
2 ^ -> Failure
UnKnown decorator err_deprecated
可以尝试以下步骤来修复这个错误:
- 检查装饰器是否存在。
1.2.4 InvalidDecoratorTargetError [E2H14]
如果在运行 KCL 时遇到错误:
InvalidDecoratorTargetError
, 对应的 encode 为E2H14
那么此时 KCL 程序中出现了
- 无效的装饰器目标错误。
可以尝试以下步骤来修复这个错误:
- 检查使用装饰器的 KCL 代码是否出现异常。
1.2.5 MixinNamingError [E2C15]
如果在运行 KCL 时遇到错误:
MixinNamingError
, 对应的 encode 为E2C15
那么此时 KCL 程序中出现了
- Mixin 命名错误。
可能出现错误的 KCL 程序片段如下:
schema Person:
firstName: str
lastName: str
fullName: str
schema Fullname: # Mixin的名称应该以Mixin结尾
fullName = "{} {}".format(firstName, lastName)
schema Scholar(Person):
mixin [Fullname]
school: str
JohnDoe = Scholar {
"firstName": "John",
"lastName": "Doe",
"fullName": "Doe Jon"
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2C15] : Illegal mixin naming
---> File mixin/invalid_name_failure/main.k:10:12
10 | mixin [Fullname]
12 ^ -> Failure
a valid mixin name should end with 'Mixin', got 'Fullname'
可以尝试以下步骤来修复这个错误:
- 如果 schema 是一个 mixin,那么这个 schema 的名称应该以 Mixin 结尾。
1.2.6 MixinStructureIllegal [E2C16]
如果在运行 KCL 时遇到错误:
MixinStructureIllegal
, 对应的 encode 为E2C16
那么此时 KCL 程序中出现了
- Mixin 结构错误。
可以尝试以下步骤来修复这个错误:
- 检查作为 Mixin 的 Schema 的结构。
1.2.7 CannotAddMembersComplieError [E2B17]
如果在运行 KCL 时遇到错误:
CannotAddMembersComplieError
, 对应的 encode 为E2B17
那么此时 KCL 程序中出现了
- 使用 Schema 中不存在的成员。
可能出现错误的 KCL 程序片段如下:
schema Girl:
gender: str = "female"
alice = Girl {
"first": "alice", # Schema中没有成员“first”
"last": " Green", # Schema中没有成员“last”
"age": 10 # Schema中没有成员“age”
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2B18] : Cannot add members to a schema
---> File /invalid/add_attribute/main.k:9:9
9 |alice = Girl {
9 ^ -> Failure
first,last,age: No such member in the schema
可以尝试以下步骤来修复这个错误:
- 为 Schema 添加缺少的成员。
- 不要使用 Schema 中不存在的成员。
1.2.8 IndexSignatureError [E2B20]
如果在运行 KCL 时遇到错误:
IndexSignatureError
, 对应的 encode 为E2B20
那么此时 KCL 程序中出现了
- 在一个 schema 中使用多个索引签名。
可能出现错误的 KCL 程序片段如下:
schema Data:
[str]: str
[str]: int # 在同一个schema中使用了多个索引签名
data = Data {
name: "test"
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2B20] : Invalid index signature
---> File index_signature/fail_1/main.k:3:5
3 | [str]: int
5 ^^^^^^^^^^ -> Failure
only one index signature is allowed in the schema
可以尝试以下步骤来修复这个错误:
- 删除多余的索引签名。
- schema 中索引签名的名称与 schema 中其他属性的名称存在同名冲突。
可能出现错误的 KCL 程序片段如下:
schema Data:
name: str # name
[name: str]: str # 已有名称为name的schema属性
data = Data {
name: "test"
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2B20] : Invalid index signature
---> File index_signature/fail_2/main.k:3:5
3 | [name: str]: str
5 ^ -> Failure
index signature attribute name 'name' cannot have the same name as schema attributes
可以尝试以下步骤来修复这个错误:
- 删除 schema 中出现同名冲突的属性或者索引签名,或者为它们更换不同的名称。
- schema 索引签名的类型与 schema 实例化的属性类型冲突。
可能出现错误的 KCL 程序片段如下:
schema Data:
[str]: int
data = Data {
name: "test" # 索引签名为 [str]:int, "test"的类型不是int.
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File index_signature/fail_3/main.k:4:8
4 |data = Data {
8 ^ -> Failure
expected schema index signature value type int, got str(test) of the key 'name'
可以尝试以下步骤来修复这个错误:
- 检查 schema 索引签名的类型与 schema 实例中的属性类型是否一致。
- Schema 中的属性与索引签名冲突
可能出现错误的 KCL 程序片段如下:
schema Data:
count: int # int 和 str 冲突
[str]: str
data = Data {
count: 1
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2B20] : Invalid index signature
---> File index_signature/fail_4/main.k:2:5
2 | count: int
5 ^ -> Failure
the type 'int' of schema attribute 'count' does not meet the index signature definition [str]: str
可以尝试以下步骤来修复这个错误:
- 调整 Schema 属性或者调整索引签名。
1.2.9 TypeComplieError [E2G22]
如果在运行 KCL 时遇到错误:
TypeComplieError
, 对应的 encode 为E2G22
那么此时 KCL 程序中出现了
- 静态类型检查错误。
可能出现错误的 KCL 程序片段如下:
schema Person:
firstName: str
lastName: int
JohnDoe = Person {
"firstName": "John",
"lastName": "Doe" # Schema中定义lastName: int
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2G22] : The type got is inconsistent with the type expected
---> File type/type_fail_0/main.k:7:5
7 | "lastName": "Doe"
5 ^ -> Failure
expect int, got str(Doe)
可以尝试以下步骤来修复这个错误:
- 检查赋给某个变量的值的类型与这个变量的类型是否一致。
1.2.10 CompileError [E2L23]
如果在运行 KCL 时遇到错误:
CompileError
, 对应的 encode 为E2L23
那么此时 KCL 程序中出现了
- 不支持的类型合并
可能出现错误的 KCL 程序片段如下:
_data = [1, 2, 3]
_data |= "value"
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File union/fail/fail_1/main.k:2
2 |_data |= "value" -> Failure
unsupported operand type(s) for |=: '[int]' and 'str(value)'
- 不支持的操作符类型
可能出现错误的 KCL 程序片段如下:
a = None
b = 1 + None # KCL中不支持None和int之间进行+操作
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File operator/operator_fail_0/main.k:2
2 |b = 1 + None -> Failure
unsupported operand type(s) for +: 'int(1)' and 'NoneType'
可以尝试以下步骤来修复这个错误:
- 调整操作符号,使其同时支持两个操作数的类型。
- 调整操作数,使其同时符合操作符号的约束。
- 没有定义的变量
可能出现错误的 KCL 程序片段如下:
a = 1
b = "${c + 1}" # 'c' 没有定义
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File var_not_define_fail_0/main.k:2:8
2 |b = "${c + 1}"
8 ^ -> Failure
name 'c' is not defined
可以尝试以下步骤来修复这个错误:
- 对未定义的变量进行定义。
- 在表达式中去掉对未定义变量的操作。
- 无效的赋值表达式
可能出现错误的 KCL 程序片段如下:
# pkg.k
a = 1
# main.k
import pkg
pkg.a |= 2
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File pkg_inplace_modify_1/main.k:3:1
3 |pkg.a |= 2
1 ^^^^^ -> Failure
module 'pkg' can't be assigned
可以尝试以下步骤来修复这个错误:
- 检查赋值表达式的内容。
- 无效的字符串表达式
可能出现错误的 KCL 程序片段如下:
a = 1
b = "${b = a + 1}" # Invalid string interpolation expression
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File invalid_format_value_fail_0/main.k:2:5
2 |b = "${b = a + 1}"
5 ^^^^^^^^^^^^^^ -> Failure
invalid string interpolation expression 'b = a + 1'
可以尝试以下步骤来修复这个错误:
- 检查字符串表达式的内容。
- 无效的循环变量
可能出现错误的 KCL 程序片段如下:
data = {"key1": "value1", "key2": "value2"}
dataLoop = [i for i, j, k in data] # the number of loop variables can only be 1 or 2
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L23] : A complie error occurs during compiling
---> File dict/invalid_loop_var_fail_0/main.k:2:19
2 |dataLoop = [i for i, j, k in data] # error
19 ^^^^^^^ -> Failure
the number of loop variables is 3, which can only be 1 or 2
1.2.11 KCLNameError [E2L25]
如果在运行 KCL 时遇到错误:
KCLNameError
, 对应的 encode 为E2L25
那么此时 KCL 程序中出现了
- 试图访问的变量名不存在
可以尝试以下步骤来修复这个错误:
- 检查报错信息中出现的变量是否存在。
1.2.12 KCLValueError [E2L26]
如果在运行 KCL 时遇到错误:
KCLValueError
, 对应的 encode 为E2L26
那么此时 KCL 程序中出现了
- 值错误,传给参数的类型不正确
可以尝试以下步骤来修复这个错误:
- 检查参数的具体类型。
1.2.13 KCLKeyError [E2L27]
如果在运行 KCL 时遇到错误:
KCLKeyError
, 对应的 encode 为E2L27
那么此时 KCL 程序中出现了
- 使用了 dict 中不存在的 key 时引发的 key 错误
可以尝试以下步骤来修复这个错误:
- 检查字典中是否存在 key。
1.2.14 UniqueKeyError [E2L28]
如果在运行 KCL 时遇到错误:
UniqueKeyError
, 对应的 encode 为E2L28
那么此时 KCL 程序中出现了
- 变量同名或重复定义。
可能出现错误的 KCL 程序片段如下:
schema Person:
name: str = "kcl"
age: int = 1
schema Person:
aa: int
x0 = Person{}
x1 = Person{age:101}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2L28] : Unique key error
---> File /schema/same_name/main.k:5:1
5 |schema Person:
1 ^ -> Failure
Variable name 'Person' must be unique in package context
可以尝试以下步骤来修复这个错误:
- 检查出现错误的名称是否已经被使用。
1.2.15 KCLAttributeComplieError [E2A29]
如果在运行 KCL 时遇到错误:
KCLAttributeComplieError
, 对应的 encode 为E2A29
那么此时 KCL 程序中出现了
- Schema 的属性错误。
可能出现错误的 KCL 程序片段如下:
# pkg
schema A:
field_A: str
# main
import pkg as p
a = p.D + 1
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2A29] : Attribute error occurs during compiling
---> File /import/module/no_module_attr_fail_0/main.k:3:5
3 |a = p.D + 1
5 ^ -> Failure
module 'pkg' has no attribute 'D'
可以尝试以下步骤来修复这个错误:
- 在使用 Schema 属性时检查这个属性是否存在。
1.2.16 MultiInheritError [E2D32]
如果在运行 KCL 时遇到错误:
MultiInheritError
, 对应的 encode 为E2D32
那么此时 KCL 程序中出现了
- 多继承错误。
可能出现错误的 KCL 程序片段如下:
schema Person:
firstName: str
lastName: str
schema KnowledgeMixin:
firstName: int
subject: str
schema Scholar(KnowledgeMixin, Person): # KCL中不支持多继承
school: str
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2D32] : Multiple inheritance is illegal
---> File /schema/inherit/multi_inherit_fail_1/main.k:9:16
9 |schema Scholar(KnowledgeMixin, Person):
16 ^^^^^^^^^^^^^^^^^^^^^^ -> Failure
Multiple inheritance of Scholar is prohibited
可以尝试以下步骤来修复这个错误:
- 检查程序的继承结构,KCL 中不支持多继承。
1.2.17 IllegalInheritError [E2D34]
如果在运行 KCL 时遇到错误:
IllegalInheritError
, 对应的 encode 为E2D34
那么此时 KCL 程序中出现了
- 不合法的继承结构
可能出现错误的 KCL 程序片段如下:
schema FullnameMixin:
fullName = "{} {}".format(firstName, lastName)
schema Scholar(FullnameMixin): # KCL中不支持Schema继承Mixin
school: str
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2D34] : Illegal inheritance
---> File /schema/inherit/inherit_mixin_fail/main.k:8:1
8 |schema Scholar(FullnameMixin):
1 ^ -> Failure
mixin inheritance FullnameMixin is prohibited
可以尝试以下步骤来修复这个错误:
- KCL 中 Schema 支持单继承 Schema。
1.2.18 IllegalArgumentComplieError [E2I36]
如果在运行 KCL 时遇到错误:
IllegalArgumentComplieError
, 对应的 encode 为E2I36
那么此时 KCL 程序中出现了
- 参数错误
可能出现错误的 KCL 程序片段如下:
a = option("key")
# kcl main.k -D key=value=
# key=value= is an illegal expression
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2I36] : Illegal argument during compiling
'key=value='
可以尝试以下步骤来修复这个错误:
- 检查通过命令设置的 KCL option 参数是否为合法参数。
1.2.19 ImmutableCompileError [E3L41]
如果在运行 KCL 时遇到错误:
ImmutableCompileError
, 对应的 encode 为E3L41
那么此时 KCL 程序中出现了
- 不可变量的值发生改变
可能出现错误的 KCL 程序片段如下:
a = 2147483646
a += 1
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Compile Error[E2L41] : Immutable variable is modified
---> File /range_check_int/augment_assign/main.k:2:1
2 |a += 1
1 ^ -> Failure
Immutable variable is modified
可以尝试以下步骤来修复这个错误:
- 将被改变的不可变量设置为私有或者去掉对不可变量值的改动。
1.3 KCL 运行时错误 (E3xxx)
KCL 会出现的运行时错误信息如下表所示:
ewcode | KCL exception | messages |
---|---|---|
E3F06 | RecursiveLoad | Recursively loading module |
E3K04 | FloatOverflow | Float overflow |
E3K09 | IntOverflow | Integer overflow |
E3N11 | DeprecatedError | Deprecated error |
E3A30 | KCLAttributeRuntimeError | Attribute error occurs at runtime |
E3G21 | TypeRuntimeError | The type got is inconsistent with the type expected |
E3B17 | SchemaCheckFailure | Schema check is failed to check condition |
E3B19 | CannotAddMembersRuntimeError | Cannot add members to a schema |
E3M38 | EvaluationError | Evaluation failure |
E3M39 | InvalidFormatSpec | Invalid format specification |
E3M40 | KCLAssertionError | Assertion failure |
E3M44 | ImmutableRuntimeError | Immutable variable is modified |
E2D33 | CycleInheritError | Cycle Inheritance is illegal |
E3M42 | KCLRecursionError | Recursively reference |
1.3.1 RecursiveLoad [E3F06]
如果在运行 KCL 时遇到错误:
RecursiveLoad
, 对应的 encode 为E3F06
那么此时 KCL 程序中出现了
- 循环导入错误
可能出现错误的 KCL 程序片段如下:
# module.k
import main # module.k 导入了 main.k
print('module')
# main.k
import module # main.k 导入了 module.k
print('main')
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3F06] : Recursively loading module
---> File /import/recursive_import_fail/main.k:4
4 | -> Failure
In module module, recursively loading modules: module, main
可以尝试以下步骤来修复这个错误:
- 检查包的导入部分是否存在循环导入的问题。
1.3.2 FloatOverflow [E3K04]
如果在运行 KCL 时遇到错误:
FloatOverflow
, 对应的 encode 为E3K04
那么此时 KCL 程序中出现了
- 浮点数溢出
可能出现错误的 KCL 程序片段如下:
uplimit = 3.402823466e+38
epsilon = 2.220446049250313e-16
a = uplimit * (1 + epsilon)
# kcl main.k -r -d
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3K07] : Float overflow
---> File /range_check_float/overflow/number_0/main.k:6
6 |a = uplimit * (1 + epsilon) -> Failure
3.402823466000001e+38: A 32-bit floating point number overflow
可以尝试以下步骤来修复这个错误:
- 检查浮点数的值是否在 KCL 支持的数字范围内。
1.3.3 IntOverflow [E3K09]
如果在运行 KCL 时遇到错误:
IntOverflow
, 对应的 encode 为E3K09
那么此时 KCL 程序中出现了
- 整数溢出
可能出现错误的 KCL 程序片段如下:
_a = 9223372036854775807
_a += 1
# kcl test.k -d
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3K09] : Integer overflow
---> File /range_check_int/augment_assign_fail_1/main.k:2
2 |_a += 1 -> Failure
9223372036854775808: A 64 bit integer overflow
可以尝试以下步骤来修复这个错误:
- 检查整数的值是否在 KCL 支持的数字范围内。
1.3.4 DeprecatedError [E3N11]
如果在运行 KCL 时遇到错误:
DeprecatedError
, 对应的 encode 为E3N11
那么此时 KCL 程序中出现了
- 使用废弃代码
可能出现错误的 KCL 程序片段如下:
schema Person:
firstName: str = "John"
lastName: str
@deprecated(version="1.16", reason="use firstName and lastName instead", strict=True)
name: str
JohnDoe = Person {
name: "deprecated" # name已经被过时,并且strict设置为True
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3N11] : Deprecated error
---> File /schema/deprecated/member_standard_1/main.k:7
7 |JohnDoe = Person { -> Failure
name was deprecated since version 1.16, use firstName and lastName instead
可以尝试以下步骤来修复这个错误:
- strict 设置为 True 时无法使用过时的代码,可以将 strict 设置为 False,将不会出现错误,而是输出一个警告。
- 调整代码,不使用已经过时的代码。
1.3.5 KCLAttributeRuntimeError [E3A30]
如果在运行 KCL 时遇到错误:
KCLAttributeRuntimeError
, 对应的 encode 为E3A30
那么此时 KCL 程序中出现了
- 属性错误。
可能出现错误的 KCL 程序片段如下:
import math
a = math.err_func(1) # err_func is not found in math
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3A30] : Attribute error occurs at runtime
---> File /import/module/no_module_attr_fail_2/main.k:3
3 |a = math.err_func(1) -> Failure
module 'math' has no attribute 'err_func'
可以尝试以下步骤来修复这个错误:
- 检查属性调用是否正确。
1.3.6 TypeRuntimeError [E3G21]
如果在运行 KCL 时遇到错误:
TypeRuntimeError
, 对应的 encode 为E3G21
那么此时 KCL 程序中出现了
- 类型检查错误
可能出现错误的 KCL 程序片段如下:
schema Person:
name: str = "Alice"
_personA = Person {}
_personA |= {"name": 123.0} # name: str = "Alice"
personA = _personA
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3G21] : The type got is inconsistent with the type expected
---> File /fail/fail_4/main.k:5
5 |_personA |= {"name": 123.0} -> Failure
expect str, got float
可以尝试以下步骤来修复这个错误:
- 停止错误的类型合并或者将类型调整为 KCL 支持的类型合并。
1.3.7 SchemaCheckFailure [E3B17]
如果在运行 KCL 时遇到错误:
SchemaCheckFailure
, 对应的 encode 为E3B17
那么此时 KCL 程序中出现了
- Schema 中的 check 条件冲突
可能出现错误的 KCL 程序片段如下:
schema Person:
lastName: str
age: int
check:
age < 140, "age is too large"
JohnDoe = Person {
"lastName": "Doe",
"age": 1000 # Schema中的check条件为: age < 140
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3B17] : Schema check is failed to check condition
---> File /check_block/check_block_fail_1/main.k:9:11
9 |JohnDoe = Person {
11 ^ -> Check failed in the schema
---> File /check_block/check_block_fail_1/main.k:7
7 | age < 140, "age is too large" -> Check failed on the condition
age is too large
可以尝试以下步骤来修复这个错误:
- 检查 Schema 的属性与 check 中的条件是否符合
1.3.8 CannotAddMembersRuntimeError [E3B19]
如果在运行 KCL 时遇到错误:
CannotAddMembersRuntimeError
, 对应的 encode 为E3B19
那么此时 KCL 程序中出现了
- 访问 Schema 中不存在的成员
可能出现错误的 KCL 程序片段如下:
schema Name:
name: str
schema Person:
name: Name
person = Person {
name.err_name: "Alice" # err_name is not found in schema Name
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3B19] : Cannot add members to a schema
---> File /nest_var/nest_var_fail_1/main.k:8:5
8 | name.err_name: "Alice"
5 ^ -> Failure
err_name: No such member in the schema
可以尝试以下步骤来修复这个错误:
- 为 Schema 添加不存在的成员。
- 访问 Schema 中存在的成员。
1.3.9 EvaluationError [E3M38]
如果在运行 KCL 时遇到错误:
EvaluationError
, 对应的 encode 为E3M38
那么此时 KCL 程序中出现了
- 当 KCL 中数值计算过程出现了错误。
可能出现错误的 KCL 程序片段如下:
_list1 = [1, 2, 3] # _list1 is a variable, and its type can only be known at runtime
_list2 = None # _list1 is a variable, and its type can only be known at runtime
result2 = _list1 + _list2 # list + NoneType is illegal
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3M38] : Evaluation failure
---> File /datatype/list/add_None_fail/main.k:4
4 |result2 = _list1 + _list2 -> Failure
can only concatenate list (not "NoneType") to list
可以尝试以下步骤来修复这个错误:
- 检查表达式中是否存在变量为 None,或者非法的计算过程。
1.3.10 InvalidFormatSpec [E3M39]
如果在运行 KCL 时遇到错误:
InvalidFormatSpec
, 对应的 encode 为E3M39
那么此时 KCL 程序中出现了
- 非法的字符串格式
可能出现错误的 KCL 程序片段如下:
a = 1
b = 1
data = "${a: #js}" + " $$ " # KCL插值字符串中,#js是非法的
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3M39] : Invalid format specification
---> File /datatype/str_interpolation/invalid_format_spec_fail_0/main.k:3
3 |data = "${a: #js}" + " $$ " -> Failure
#js is invalid format spec
可以尝试以下步骤来修复这个错误:
- 将非法 String 调整为 KCL 标准支持的 String。
1.3.11 KCLAssertionError [E3M40]
如果在运行 KCL 时遇到错误:
KCLAssertionError
, 对应的 encode 为E3M40
那么此时 KCL 程序中出现了
- Assert False
可能出现错误的 KCL 程序片段如下:
assert False
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3M40] : Assertion failure
---> File /assert/invalid/fail_0/main.k:1
1 |assert False -> Failure
Assertion failure
可以尝试以下步骤来修复这个错误:
- 检查 Assert 的条件,Assert 条件为 False 时,就会出现此类错误,去掉 Assert 语句或改变条件为 True。
1.3.12 ImmutableRuntimeError [E3M44]
如果在运行 KCL 时遇到错误:
ImmutableRuntimeError
, 对应的 encode 为E3M44
那么此时 KCL 程序中出现了
- 不可变量的值发生改变
可能出现错误的 KCL 程序片段如下:
schema Person:
final firstName : str
lastName : str
schema Scholar(Person):
firstName = "CBA"
scholar = Scholar {
"firstName": "ABC" # firstName in schema Person is final.
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3M41] : Immutable variable is modified
---> File /final/fail_lazy_init_0/main.k:12:5
12 | "firstName": "ABC"
5 ^ -> Failure
final schema field 'firstName'
可以尝试以下步骤来修复这个错误:
- 检查 final 修饰的不可变量是否出现了赋值等改变值的操作。
1.3.13 CycleInheritError [E2D33]
如果在运行 KCL 时遇到错误:
CycleInheritError
, 对应的 encode 为E2D33
那么此时 KCL 程序中出现了
- 循环继承
可能出现错误的 KCL 程序片段如下:
schema Parent(Son):
parent_field: str
schema Son(GrandSon):
son_field: str
schema GrandSon(Parent):
grandson_field: str
parent = Parent {
parent_field: ""
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Error[E2D33] : Cycle Inheritance is illegal
---> File /inherit/cycle_inherit_fail_1/main.k:7:1
7 |schema GrandSon(Parent):
1 ^ -> Failure
GrandSon and Parent
可以尝试以下步骤来修复这个错误:
- 检查 Schema 的继承关系,避免出现 A 继承 B,B 继承 A 的情况。
1.3.14 KCLRecursionError [E3M42]
如果在运行 KCL 时遇到错误:
KCLRecursionError
, 对应的 encode 为E3M42
那么此时 KCL 程序中出现了
- 循环引用
可能出现错误的 KCL 程序片段如下:
schema Parent(Son):
parent_field: str
son: Son = Son { # Parent has attribute Son
parent: Parent {
parent_field: "123"
}
}
schema Son:
son_field: str
parent: Parent = Parent { # Son has attribute Parent
son: Son {
son_field: "123"
}
}
parent = Parent {
parent_field: "",
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Runtime Error[E3M42] : Recursively reference
---> File /init/init_cycle_fail_0/main.k:10
10 | son_field: str -> Failure
maximum recursion depth exceeded in __instancecheck__
可以尝试以下步骤来修复这个错误:
- 检查 Schema 中的属性成员,避免出现循环引用的问题。
1.4 KCL 编译警告 (W2xxx)
KCL 中的编译警告如下表所示:
ewcode | KCL exception | messages |
---|---|---|
W2K04 | FloatUnderflow | Float underflow |
W2P10 | InvalidDocstring | Invalid docstring |
W2N12 | DeprecatedWarning | Deprecated warning |
1.4.1 FloatUnderflow [W2K08]
如果在运行 KCL 时遇到错误:
FloatUnderflow
, 对应的 encode 为W2K08
那么此时 KCL 程序中出现了
- 看看 python 里面是怎么说的
可能出现错误的 KCL 程序片段如下:
downlimit = 1.175494351e-38
uplimit = 3.402823466e+38
epsilon = 2.220446049250313e-16
a = uplimit / (1 + epsilon)
b = downlimit / (1 + epsilon)
# kcl main.k -r -d
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Complier Warning[W2K08] : Float underflow
---> File /range_check_float/underflow/number_0/main.k:7
7 |b = downlimit / (1 + epsilon) -> Failure
1.1754943509999997e-38: A 32-bit floating point number underflow
可以尝试以下步骤来修复这个错误:
- 检查浮点数的值是否在 KCL 支持的数字范围内。
1.4.2 InvalidDocstring [W2P10]
如果在运行 KCL 时遇到错误:
InvalidDocstring
, 对应的 encode 为W2P10
那么此时 KCL 程序中出现了
- 无效的 doc 内容
可以尝试以下步骤来修复这个错误:
- 请按照 KCL 标准编写 doc。
1.4.3 DeprecatedWarning [W2N12]
如果在运行 KCL 时遇到错误:
DeprecatedWarning
, 对应的 encode 为W2N12
那么此时 KCL 程序中出现了
- 过时的代码警告
可能出现错误的 KCL 程序片段如下:
schema Person:
firstName?: str = "John"
lastName?: str
@deprecated(version="1.16", reason="use firstName and lastName instead", strict=False)
name?: str
JohnDoe = Person {
name: "deprecated" # name is deprecated and strict is False
}
KCL 在运行上述 KCL 程序片段时的输出信息如下.
KCL Compile Warning[W2N12] : Deprecated warning
name was deprecated since version 1.16, use firstName and lastName instead
可以尝试以下步骤来修复这个错误:
- 尽量不要使用已经过时的代码。如果将 strict 设置为 True,KCL 将会输出错误,并停止运行。