Repository: incubator-freemarker Updated Branches: refs/heads/3 e4427fb26 -> 12a2d49d0
Bug fixed (part of FREEMARKER-48): When an arithmetic exception has occurred in an expression (typically division by zero), the template processing has thrown the ArithmeticException as is, without packaging it into a TemplateException. Thus, the error location in the template wasn't visible in the exception. Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/12a2d49d Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/12a2d49d Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/12a2d49d Branch: refs/heads/3 Commit: 12a2d49d0edcb10c63b81c5ec68dba639dc86633 Parents: e4427fb Author: ddekany <[email protected]> Authored: Mon Sep 18 22:50:30 2017 +0200 Committer: ddekany <[email protected]> Committed: Mon Sep 18 22:50:30 2017 +0200 ---------------------------------------------------------------------- .../freemarker/core/MiscErrorMessagesTest.java | 10 ++++++ .../core/StringLiteralInterpolationTest.java | 2 +- .../freemarker/core/ASTExpArithmetic.java | 38 +++++++++++--------- 3 files changed, 33 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/12a2d49d/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java index 1903e05..9f73968 100644 --- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java +++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java @@ -19,6 +19,9 @@ package org.apache.freemarker.core; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat; import org.apache.freemarker.test.TemplateTest; import org.apache.freemarker.test.TestConfigurationBuilder; @@ -45,4 +48,11 @@ public class MiscErrorMessagesTest extends TemplateTest { assertErrorContains("${{}[10]}", "[]", "?api"); } + @Test + public void aritheticException() { + Throwable e = assertErrorContains("<#assign x = 0>\n${1 / x}", "Arithmetic"); + assertThat(e, instanceOf(TemplateException.class)); + assertEquals((Integer) 2, ((TemplateException) e).getLineNumber()); + } + } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/12a2d49d/freemarker-core-test/src/test/java/org/apache/freemarker/core/StringLiteralInterpolationTest.java ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/StringLiteralInterpolationTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/StringLiteralInterpolationTest.java index 7a71289..13b9bff 100644 --- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/StringLiteralInterpolationTest.java +++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/StringLiteralInterpolationTest.java @@ -78,7 +78,7 @@ public class StringLiteralInterpolationTest extends TemplateTest { public void testErrors() { addToDataModel("x", 1); assertErrorContains("${'${noSuchVar}'}", InvalidReferenceException.class, "missing", "noSuchVar"); - assertErrorContains("${'${x/0}'}", ArithmeticException.class, "zero"); + assertErrorContains("${'${x/0}'}", "zero"); } @Test http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/12a2d49d/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpArithmetic.java ---------------------------------------------------------------------- diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpArithmetic.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpArithmetic.java index a15567e..632baca 100644 --- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpArithmetic.java +++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpArithmetic.java @@ -54,22 +54,28 @@ final class ASTExpArithmetic extends ASTExpression { static TemplateModel _eval(Environment env, ASTNode parent, Number lhoNumber, int operator, Number rhoNumber) throws TemplateException { ArithmeticEngine ae = _EvalUtils.getArithmeticEngine(env, parent); - switch (operator) { - case TYPE_SUBSTRACTION : - return new SimpleNumber(ae.subtract(lhoNumber, rhoNumber)); - case TYPE_MULTIPLICATION : - return new SimpleNumber(ae.multiply(lhoNumber, rhoNumber)); - case TYPE_DIVISION : - return new SimpleNumber(ae.divide(lhoNumber, rhoNumber)); - case TYPE_MODULO : - return new SimpleNumber(ae.modulus(lhoNumber, rhoNumber)); - default: - if (parent instanceof ASTExpression) { - throw new TemplateException((ASTExpression) parent, - "Unknown operation: ", Integer.valueOf(operator)); - } else { - throw new TemplateException("Unknown operation: ", Integer.valueOf(operator)); - } + try { + switch (operator) { + case TYPE_SUBSTRACTION : + return new SimpleNumber(ae.subtract(lhoNumber, rhoNumber)); + case TYPE_MULTIPLICATION : + return new SimpleNumber(ae.multiply(lhoNumber, rhoNumber)); + case TYPE_DIVISION : + return new SimpleNumber(ae.divide(lhoNumber, rhoNumber)); + case TYPE_MODULO : + return new SimpleNumber(ae.modulus(lhoNumber, rhoNumber)); + default: + if (parent instanceof ASTExpression) { + throw new TemplateException((ASTExpression) parent, + "Unknown operation: ", Integer.valueOf(operator)); + } else { + throw new TemplateException("Unknown operation: ", Integer.valueOf(operator)); + } + } + } catch (ArithmeticException e) { + throw new TemplateException(e, env, + "Arithmetic operation failed", + (e.getMessage() != null ? new String[] { ": ", e.getMessage() } : " (see cause exception)")); } }
