0

在 Drools 执行期间,如果我在任何规则中遇到任何异常,规则引擎应该跳过特定规则并执行知识库中的其余规则。

4

1 回答 1

1

如果规则的 RHS 可能触发异常,则由规则作者以这种方式编写 RHS 来处理异常。

这也是因为异常可能发生在 RHS 主体的任何一点;RHS 的其余语句可能会错过在可能触发异常的操作之后用新状态更新工作记忆的机会,从而从业务/领域/知识的角度来看,使工作记忆处于不一致的状态,如在以下示例中:

rule "Process order"
when
  $o : Order()
then
  processSomeOrder($o); // some exception might occur here
  ...
  delete($o);
end

如果没有异常处理,这可能会导致多次处理订单,总是以异常结束;根据业务/领域/知识的观点,规则可能会修改如下:

rule "Process order"
when
  $o : Order()
then
  try {
    processSomeOrder($o); // some exception might occur here
  } catch(Exception e) {
    forwardOrderToHumanForManualProcessing($o, e);
  }
  ...
  delete($o);
end

在此示例中,由领域/业务设计决定如何处理标准处理期间发生的潜在异常,并在出现异常的情况下进行另一个业务操作。在任何情况下,WM 的状态都会得到一致的管理。

于 2019-01-15T19:41:34.163 回答