【发布时间】:2015-08-27 15:33:35
【问题描述】:
我正在尝试按照以下 URL 在 ODM 8.5.1 中实现异常处理,但在 IlrContext 类中找不到 setExceptionHandler 方法。
请帮助我实现它的详细过程或提供任何我可以参考的示例代码以更好地理解它。
【问题讨论】:
标签: rule-engine ilog
我正在尝试按照以下 URL 在 ODM 8.5.1 中实现异常处理,但在 IlrContext 类中找不到 setExceptionHandler 方法。
请帮助我实现它的详细过程或提供任何我可以参考的示例代码以更好地理解它。
【问题讨论】:
标签: rule-engine ilog
我不确定您所说的“找不到 setExceptionHandler”方法是什么意思,但我附上了一些代码 sn-ps,所以也许这有助于澄清。
根据您使用的规则算法的类型,可以使用两种不同的异常处理程序。
如果你使用的是RetePlus,你可以使用属于IlrContext类的setExceptionHandler(IlrContext javadoc)
代码如下:
package com.ibm.sample.exceptionHandler;
import ilog.rules.engine.IlrExceptionHandler; import ilog.rules.engine.IlrUserRuntimeException;
public class ruleHandler implements IlrExceptionHandler {
public ruleHandler(){
}
@Override
public boolean handleException(IlrUserRuntimeException ex) {
// TODO Auto-generated method stub
if(ex.isInConditions()){
System.out.println("Caught by rule handler");
return false;
}else{
throw ex;
}
}
}
并且将捕获规则的条件部分中抛出的任何异常(再次使用 RetePlus 时)。
您在执行前将其添加到引擎 - 使用生成的 RuleEngineRunner 类 - 只需添加:
IlrContext engine = new IlrContext(ruleset);
**engine.setExceptionHandler(ruleHandler);**
RuleflowExceptionHandler 与 FastPath 和 Sequential 类似,但为您提供了更多选项来确定异常发生的位置(请记住,RetePlus 的 ExceptionHandler 仅在规则本身中)。
public ruleFlowHandler(){
}
@Override
public boolean handleException(IlrUserRuntimeException ex) {
// TODO Auto-generated method stub
if(ex.isInConditions()){
System.out.println("Condition error caught by ruleflow handler");
return false;
}else{
if(ex.isInternal()){
System.out.println("internal exception caught by ruleflow handler");
return false;
}else{
if(ex.isInActions()){
System.out.println("Action exception caught by ruleflow handler");
return false;
}else{
System.out.println("Throw exception");
return true;
}
}
}
}
如您所见,我们现在可以确定异常是在规则流本身、规则的条件部分还是规则的操作部分。处理程序的附加方式与 ExceptionHandler 相同:
IlrContext engine = new IlrContext(ruleset);
**engine.setExceptionHandler(ruleFlowHandler);**
这两个调用都在您的客户端 java 代码中。如果您想在通过 HTDS 之类的东西运行时添加这些,只需创建一个简单的虚拟 BOM 条目,将处理程序添加到当前上下文。
在我的示例中,我的静态方法的 BOM/XOM 映射代码如下所示:
context.setExceptionHandler(new ruleHandler());
context.setRuleFlowHandler(new ruleFlowHandler());
我从 RuleFlow 的初始操作中调用了代码。对于 RetePlus,我只需添加一个规则集变量,该变量将在进入规则集时构建异常处理程序。
在所有情况下,请确保异常处理代码位于您的规则集/应用程序的类路径中。
【讨论】: