捕获JEXL中自定义函数抛出的异常

时间:2013-11-17 11:43:37

标签: java jexl

我在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。

1 个答案:

答案 0 :(得分:1)

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

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

try {
    String questionId = (String) mExpression.evaluate(mJexlContext);
} catch (JexlException e) {
    Exception original = e.getCause();
    // do something with the original
}