JBoss переводит номер строки карты из исключения следствия в фактическое следствие правила - PullRequest
1 голос
/ 10 февраля 2012

Я использую JBoss drools 5.1. Моя проблема в том, что когда следствие правила выдает исключение, трудно понять строку, вызвавшую проблему. Например, в приведенном ниже правиле выдается исключение -

rule "exception handling"
when
then
    String str = null;
    str.length();
end

Ниже приведен стек исключений

Caused by: org.drools.runtime.rule.ConsequenceException: rule: exception handling

        at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:927)
        at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:856)
        at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1071)
        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:785)
        at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:751)
        at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:218)... 26 more
Caused by: java.lang.NullPointerException
        at defaultpkg.Rule_exception_handling_0.defaultConsequence(Rule_exception_handling_0.java:8)
        at defaultpkg.Rule_exception_handling_0DefaultConsequenceInvoker.evaluate(Rule_exception_handling_0DefaultConsequenceInvoker.java:24)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:917)
        ... 32 more

Как сопоставить строку № 8 со строкой, вызвавшей исключение (в данном случае str.length ())?

1 Ответ

1 голос
/ 10 февраля 2012

Я предлагаю вам отправить заявку на проект Drools и посмотреть, могут ли они улучшить обработку исключений и отображение строк. Они уже отображают номера строк для многих вещей, включая отладку, но кажется, что исключения последствий во время выполнения не отображаются.

Между тем, это не идеальное решение, но вы можете записать сгенерированные классы в файловую систему и посмотреть на них. Номера строк взяты из этих классов. Для этого проще всего установить системное свойство, например, при запуске приложения:

java -Ddrools.dump.dir=/tmp/classdump ...

Та же опция может быть установлена ​​в файле конфигурации или API, если вы предпочитаете. Посмотрите документы Drools о том, как это сделать.

...