我正在尝试按照以下URL在ODM 8.5.1中实现异常处理,但无法在IlrContext类中找到setExceptionHandler方法。
请帮我详细说明实施过程,或提供我可以参考的更好的示例代码。
答案 0 :(得分:1)
我不确定你的意思是“找不到setExceptionHandler”方法,但我附上了一些代码片段,所以这可能有助于澄清。
可以使用两种不同的异常处理程序,具体取决于您使用的规则算法的类型。
如果您使用的是RetePlus,则可以使用属于IlrContext类(IlrContext javadoc)的setExceptionHandler
这个代码看起来像:
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;
}
}
}
}
如您所见,我们现在可以确定异常是在Ruleflow本身,规则的Condition部分还是规则的Action部分。处理程序的附加方式与ExceptionHandler相同:
IlrContext engine = new IlrContext(ruleset);
**engine.setExceptionHandler(ruleFlowHandler);**
这两个调用都将在您的客户端Java代码中。如果你想在通过像HTDS这样的东西运行时添加它们,那么只需创建一个简单的虚拟BOM条目,将处理程序添加到当前上下文中。
在我的示例中,我的静态方法的BOM / XOM映射代码如下所示:
context.setExceptionHandler(new ruleHandler());
context.setRuleFlowHandler(new ruleFlowHandler());
我从RuleFlow的Initial Action调用了代码。在RetePlus的情况下,我只需添加一个规则集变量,该变量在输入规则集时将构造异常处理程序。
在所有情况下,请确保异常处理代码位于规则集/应用程序的类路径中。