14.11. DRL 故障排除的错误消息
Red Hat Process Automation Manager 为 DRL 错误提供标准化的信息,以帮助您对 DRL 文件中的问题进行故障排除和解决问题。错误消息使用以下格式:
图 14.1. DRL 文件问题的错误消息格式
- 1st Block: Error code
- 发生错误的 DRL 源中的 2nd Block: Line 和 column
- 第 3 个块: 问题的描述
- 4th Block: 发生错误的 DRL 源(规则、函数、查询)中的组件
- 5th Block: 在发生错误的 DRL 源中的模式(如果适用)
Red Hat Process Automation Manager 支持以下标准化错误消息:
- 101: 无可行替代方案
表示解析器达到决策点,但不能识别替代方案。
带有不正确的拼写错误的规则示例
1: rule "simple rule" 2: when 3: exists Person() 4: exits Student() // Must be `exists` 5: then 6: end错误消�
[ERR 101] Line 4:4 no viable alternative at input 'exits' in rule "simple rule"没有规则名称的规则示例
1: package org.drools.examples; 2: rule // Must be `rule "rule name"` (or `rule rule_name` if no spacing) 3: when 4: Object() 5: then 6: System.out.println("A RHS"); 7: end错误消�
[ERR 101] Line 3:2 no viable alternative at input 'when'在本例中,解析器在预期预期
名称时会遇到关键字,因此当作为不正确的预期令牌时,它会标记。带有不正确语法的规则示例
1: rule "simple rule" 2: when 3: Student( name == "Andy ) // Must be `"Andy"` 4: then 5: end错误消息
[ERR 101] Line 0:-1 no viable alternative at input '<eof>' in rule "simple rule" in pattern Student注意行和列值为
0:-1表示解析器达到源文件的末尾(<eof>),但遇到不完整的结构,通常是因为缺少引号"…"、apostrophes'…'或括号(…)。- 102: 不匹配的输入
表示解析器预期在当前输入位置中缺少的特定符号。
带有不完整 rule 语句的规则示例
1: rule simple_rule 2: when 3: $p : Person( // Must be a complete rule statement错误消息
[ERR 102] Line 0:-1 mismatched input '<eof>' expecting ')' in rule "simple rule" in pattern Person注意行和列值为
0:-1表示解析器达到源文件的末尾(<eof>),但遇到不完整的结构,通常是因为缺少引号"…"、apostrophes'…'或括号(…)。带有不正确语法的规则示例
1: package org.drools.examples; 2: 3: rule "Wrong syntax" 4: when 5: not( Car( ( type == "tesla", price == 10000 ) || ( type == "kia", price == 1000 ) ) from $carList ) // Must use `&&` operators instead of commas `,` 6: then 7: System.out.println("OK"); 8: end错误信�
[ERR 102] Line 5:36 mismatched input ',' expecting ')' in rule "Wrong syntax" in pattern Car [ERR 101] Line 5:57 no viable alternative at input 'type' in rule "Wrong syntax" [ERR 102] Line 5:106 mismatched input ')' expecting 'then' in rule "Wrong syntax"在本例中,syntactic 问题会导致多个与彼此相关的错误消息。使用
&& 运算符替换逗号的单一解决方案会解决所有错误。如果您遇到多个错误,请一次解决,以防出现以前的错误。- 103: failed predicate
表示验证语义 predicate 被评估为
false。这些语义 predicates 通常用于识别 DRL 文件中的组件关键字,如声明、规则、存在等。带有无效关键字的规则示例
1: package nesting; 2: 3: import org.drools.compiler.Person 4: import org.drools.compiler.Address 5: 6: Some text // Must be a valid DRL keyword 7: 8: rule "test something" 9: when 10: $p: Person( name=="Michael" ) 11: then 12: $p.name = "other"; 13: System.out.println(p.name); 14: end错误消�
[ERR 103] Line 6:0 rule 'rule_key' failed predicate: {(validateIdentifierKey(DroolsSoftKeywords.RULE))}? in rule有些文本行无效,因为它没有以或不是 DRL 关键字结构的一部分,因此解析器无法验证 DRL 文件的其余部分。注意此错误类似于
102:不匹配的输入,但通常涉及 DRL 关键字。- 104:不允许使用分号
表示规则条件中的
eval ()子句使用分号(但不得使用)。带有
eval ()和尾部分号的规则示例1: rule "simple rule" 2: when 3: eval( abc(); ) // Must not use semicolon `;` 4: then 5: end错误消æ�¯
[ERR 104] Line 3:4 trailing semi-colon not allowed in rule "simple rule"- 105: 不与任何项匹配
表示解析器在语法中达到了一个子规则,它必须至少匹配一次,但子规则与任何规则不匹配。解析器已输入了一个分支,无需超时。
空条件中带有无效文本的规则示例
1: rule "empty condition" 2: when 3: None // Must remove `None` if condition is empty 4: then 5: insert( new Person() ); 6: end错误消�
[ERR 105] Line 2:2 required (...)+ loop did not match anything at input 'WHEN' in rule "empty condition"在本例中,条件应为空,但使用了
None。通过删除None来解决此错误,这不是有效的 DRL 关键字、数据类型或模式结构。
如果您遇到无法解决的其他 DRL 错误消息,请联系您的红帽大客户经理。