16.11. DRL トラブルシューティングのエラーメッセージ
Red Hat Decision Manager は、DRL エラーに関する標準メッセージを提供します。これらのメッセージは DRL ファイルで問題をトラブルシューティングして解決するのに役立ちます。エラーメッセージでは、以下の形式が使用されています。
図16.1 DRL ファイルの問題に関するエラーメッセージの形式
- 最初のブロック: エラーコード
- 2 番目のブロック: DRL ソースのエラーが発生している行および列
- 3 番目のブロック: 問題の説明
- 4 番目のブロック: DRL ソース内のエラーが発生しているコンポーネント (ルール、関数、クエリー)
- 5 番目のブロック: DRL ソース内のエラーが発生しているパターン (該当する場合)
Red Hat Decision Manager では、以下の標準化されたエラーメッセージがサポートされます。
- 101: no viable alternative
パーサーが決定ポイントに到達したにもかかわらず、選択肢を特定できなかったことを示します。
誤ったスペリングを含むルールの例
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'
この例では、パーサーがキーワード
when
を検出しましたが、予想していたのはルール名であったため、パーサーは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>
) に到達しましたが、不完全な設定を検出したことを示します。よくある原因として、引用符"…"
、アポストロフィー'…'
、または括弧(…)
が欠落している場合があります。- 102: mismatched input
パーサーが特定の記号を予想していましたが、これが現在の入力位置で欠落していることを示します。
不完全なルールステートメントが使用されるルールの例
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>
) に到達しましたが、不完全な設定を検出したことを示します。よくある原因として、引用符"…"
、アポストロフィー'…'
、または括弧(…)
が欠落している場合があります。誤った構文が使用されるルールの例
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"
この例では、構文に関する問題が原因で相互に関連する複数のエラーメッセージが発生しています。
&&
演算子で,
を置き換えるという 1 つの解決策により、すべてのエラーが解消されます。複数のエラーが発生した場合に、エラーが前のエラーの結果である場合があるため、一度に 1 つずつ解決します。- 103: failed predicate
セマンティクスの述語の検証が
false
と評価されたことを示します。これらのセマンティクスの述語は一般にdeclare
、rule
、exists
、not
など、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
Some text
の行は、DRL キーワード設定で始まっていないか、DRL キーワード設定の一部ではないため、パーサーが DRL ファイルの残りの部分の評価に失敗します。注記このエラーは
102: mismatched input
に似ていますが、通常は DRL キーワードが関係しています。- 104: trailing semi-colon not allowed
ルール条件の
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: did not match anything
パーサーが文法内で、少なくとも 1 回は代替の選択肢に一致する必要があるサブルールに到達しましたが、サブルールがいすれにも一致しなかったことを示します。パーサーは出口のないブランチに入ります。
空の条件内に無効なテキストがあるルールの例
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
という単語が使用されています。このエラーは、DRL の有効でないキーワード、データタイプ、またはパターン設定であるNone
を削除することによって解決できます。
解決できないその他の DRL エラーメッセージが発生した場合は、Red Hat のテクニカルアカウントマネージャーにお問い合わせください。