我在JEXL表达式中添加了一些可以在JEXL表达式中使用的函数:
Map<String, Object> functions = new HashMap<String, Object>();
mFunctions = new ConstraintFunctions();
functions.put(null, mFunctions);
mEngine.setFunctions(functions);
但是,某些函数可能会抛出异常,例如:
public String chosen(String questionId) throws NoAnswerException {
Question<?> question = mQuestionMap.get(questionId);
SingleSelectAnswer<?> answer = (SingleSelectAnswer<?>) question.getAnswer();
if (answer == null) {
throw new NoAnswerException(question);
}
return answer.getValue().getId();
}
在解释表达式时调用自定义函数。当然,表达式会调用此函数:
String expression = "chosen('qID')";
Expression jexl = mEngine.createExpression(expression);
String questionId = (String) mExpression.evaluate(mJexlContext);
不幸的是,当在解释过程中调用此函数时,如果它抛出NoAnswerException
,则解释器不会将它提供给我,而是抛出一般JEXLException
。有没有办法从自定义函数中捕获异常?我使用apache commons JEXL引擎,在我的项目中用作库jar。
答案 0 :(得分:1)
经过一番调查,我发现了一个简单的解决方案!
当在自定义函数中抛出异常时,JEXL将抛出一般JEXLException
。但是,它巧妙地将原始异常包装在JEXLException
中,因为它特别是原因。因此,如果我们想要捕捉原文,我们可以写下这样的内容:
try {
String questionId = (String) mExpression.evaluate(mJexlContext);
} catch (JexlException e) {
Exception original = e.getCause();
// do something with the original
}