0

我在 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,解释器不会将它传给我,而是抛出一个 general JEXLException。有没有办法从自定义函数中捕获异常?我为此使用了apache commons JEXL引擎,它在我的项目中用作库 jar。

4

1 回答 1

1

经过一番调查,我找到了一个简单的解决方案!

当在自定义函数中抛出异常时,JEXL 将抛出一个通用的JEXLException. 但是,它巧妙地将原始异常包装在 中JEXLException,因为它特别是原因。因此,如果我们想捕捉原始内容,我们可以这样写:

try {
    String questionId = (String) mExpression.evaluate(mJexlContext);
} catch (JexlException e) {
    Exception original = e.getCause();
    // do something with the original
}
于 2013-11-17T12:13:48.923 回答