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場合、インタープリターはそれを私に伝達せず、一般的な をスローしJEXLExceptionます。カスタム関数から例外をキャッチする方法はありますか? これには、プロジェクトでライブラリ jar として使用されるapache commons JEXLエンジンを使用します。

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 に答える