16.11. DRL 故障排除的错误消息
Red Hat Decision Manager 为 DRL 错误提供了标准化消息,以帮助您进行故障排除并解决 DRL 文件中的问题。错误消息使用以下格式:
图 16.1. DRL 文件问题的错误消息格式

- 1st Block: 错误代码
- 2nd Block: 发生错误的 DRL 源中的行和列
- 第 3 个块: 问题的描述
- 4th Block: 组件在 DRL 源中(rule、function、query)发生错误
- 5th Block: 发生错误的 DRL 源中的 Pattern(如果适用)
Red Hat Decision 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>),但遇到不完整的结构,通常是因为缺少引号"…"、postrophes'…'或括号(…)。- 102:不匹配的输入
表示解析器预期在当前输入位置缺少特定符号。
带有不完整规则语句的规则示例
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>),但遇到不完整的结构,通常是因为缺少引号"…"、postrophes'…'或括号(…)。带有不正确的语法的规则示例
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"
在这个示例中,sntactic 问题会导致多个错误消息相互相关。用
&& 运算符替换逗号 的单个解决方案解决了所有错误。如果您遇到多个错误,则一次解决一个错误会导致上一个错误。- 103:失败的 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()和 trailing分号的规则示例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:与任何内容不匹配
表示,解析程序在 grammar 中到达子规则,该规则必须至少匹配一次替代,但 sub-rule 不匹配任何内容。解析器已输入了一个没有方法的分支。
在空条件中带有无效文本的规则示例
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 错误消息,请联系您的红帽大客户经理。