处理Drools文件中的异常

时间:2015-02-12 15:40:10

标签: drools

我们如何处理Drools文件中的异常?

示例:我的规则使用共享Java方法。

rule "002.17.1"
    dialect "mvel"
    when
        comp : Component()
    then        
        boolean validstate = SharedCodeUtil.hasValidateStateCountryUS(comp.address);

        errors.add(new ValidationFailure("002.17.1", comp.getSubApplicationGroupID(), comp.getSubApplicationID(),tokens));

end

Java方法SharedCodeUtil可能有例外:

    if (m != null)
    {
        try
        {
            Object o = m.invoke(form,(Object[])null);
            if(BudgetType.Project.equals(o))
                count++;
        }
        catch (Exception e)
        {
            LOG.error("Error", e);
            // re-throw? who will catch?
        }

Drools文件调用的共享Java方法中存在异常条件。谁会抓住它,除了记录它还应该做些什么呢?

2 个答案:

答案 0 :(得分:3)

在规则的右侧捕获异常没有特别的问题:这是Java代码。

when
    //...
then
    try { /* some code */
    } catch( SomeException ex ){ /* handle ex */ }
end

是否需要重新投掷是一项设计决策,具体取决于异常类型。如果反射出错,那么代码中存在一个基本问题,并且延续很可能是毫无意义的。如果重新抛出,则下一级是调用规则引擎的位置:

try {
    kSession.fireAllRules();
} catch( Exception e ){
    //... handle exception
}

您可能必须在记录严重错误后终止应用程序。

在规则评估期间执行的代码中抛出异常时,情况会有所不同。这不能被“内部”捕获,它将放松到fireAllRules周围的处理程序。

请注意,负面验证结果最好不要通过例外传播。

答案 1 :(得分:0)

kieSession.execute方法的任何特定异常。

ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(cmds));
      return (Haendelse) results.getValue(haendelseOutIdentifier);
    } catch (Exception e) {
      logger.error("An error occured while processing processHaendelse for Haendelse : "
          + haendelse.getModtagetIndberetning().getHaendelsesident(), e);
      throw new RuntimeException("Exception occured in processing processHaendelse");

我不想抛出RuntimeException,但要特定一些。