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&gt;),但遇到不完整的结构,通常是因为缺少引号 "…​"、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&gt;),但遇到不完整的结构,通常是因为缺少引号 "…​"、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 问题会导致多个错误消息相互相关。用 & amp;& 运算符替换逗号 的单个解决方案解决了所有错误。 如果您遇到多个错误,则一次解决一个错误会导致上一个错误。

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 错误消息,请联系您的红帽大客户经理。