我们如何处理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方法中存在异常条件。谁会抓住它,除了记录它还应该做些什么呢?
答案 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,但要特定一些。