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)"));
         }
     }
 

Reply via email to