You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/09/18 20:50:05 UTC

incubator-freemarker git commit: 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 Tem

Repository: incubator-freemarker
Updated Branches:
  refs/heads/2.3-gae ee1e9221a -> b246de240


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/b246de24
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/b246de24
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/b246de24

Branch: refs/heads/2.3-gae
Commit: b246de2403bac5b82c44a83cc3b7ab5b6617d0e8
Parents: ee1e922
Author: ddekany <dd...@apache.org>
Authored: Mon Sep 18 22:49:56 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Mon Sep 18 22:49:56 2017 +0200

----------------------------------------------------------------------
 .../freemarker/core/ArithmeticExpression.java   | 38 +++++++++++---------
 src/manual/en_US/book.xml                       | 11 ++++++
 .../freemarker/core/MiscErrorMessagesTest.java  | 11 ++++++
 .../core/StringLiteralInterpolationTest.java    |  2 +-
 4 files changed, 45 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b246de24/src/main/java/freemarker/core/ArithmeticExpression.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/ArithmeticExpression.java b/src/main/java/freemarker/core/ArithmeticExpression.java
index 4fbe778..2ed7890 100644
--- a/src/main/java/freemarker/core/ArithmeticExpression.java
+++ b/src/main/java/freemarker/core/ArithmeticExpression.java
@@ -54,22 +54,28 @@ final class ArithmeticExpression extends Expression {
     static TemplateModel _eval(Environment env, TemplateObject parent, Number lhoNumber, int operator, Number rhoNumber)
             throws TemplateException, _MiscTemplateException {
         ArithmeticEngine ae = EvalUtil.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 Expression) {
-                    throw new _MiscTemplateException((Expression) parent,
-                            "Unknown operation: ", Integer.valueOf(operator));
-                } else {
-                    throw new _MiscTemplateException("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 Expression) {
+                        throw new _MiscTemplateException((Expression) parent,
+                                "Unknown operation: ", Integer.valueOf(operator));
+                    } else {
+                        throw new _MiscTemplateException("Unknown operation: ", Integer.valueOf(operator));
+                    }
+            }
+        } catch (ArithmeticException e) {
+            throw new _MiscTemplateException(e, env,
+                    "Arithmetic operation failed",
+                    (e.getMessage() != null ? new String[] { ": ", e.getMessage() } : " (see cause exception)"));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b246de24/src/manual/en_US/book.xml
----------------------------------------------------------------------
diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml
index 210f674..edb158b 100644
--- a/src/manual/en_US/book.xml
+++ b/src/manual/en_US/book.xml
@@ -27179,6 +27179,17 @@ TemplateModel x = env.getVariable("x");  // get variable x</programlisting>
             </listitem>
 
             <listitem>
+              <para>Bug fixed (part of <link
+              xlink:href="https://issues.apache.org/jira/browse/FREEMARKER-48">FREEMARKER-48</link>):
+              When an arithmetic exception has occurred in an expression
+              (typically division by zero), the template processing has thrown
+              the <literal>ArithmeticException</literal> as is, without
+              packaging it into a <literal>TemplateException</literal>. Thus,
+              the error location in the template wasn't visible in the
+              exception.</para>
+            </listitem>
+
+            <listitem>
               <para>When logging error due to an error in an <link
               linkend="ref.directive.attempt"><literal>attempt</literal>
               directive</link> block, the log message now indicates that the

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b246de24/src/test/java/freemarker/core/MiscErrorMessagesTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/core/MiscErrorMessagesTest.java b/src/test/java/freemarker/core/MiscErrorMessagesTest.java
index 79ccb2c..5799c12 100644
--- a/src/test/java/freemarker/core/MiscErrorMessagesTest.java
+++ b/src/test/java/freemarker/core/MiscErrorMessagesTest.java
@@ -19,9 +19,13 @@
 
 package freemarker.core;
 
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.*;
+
 import org.junit.Test;
 
 import freemarker.cache.TemplateNameFormat;
+import freemarker.template.TemplateException;
 import freemarker.test.TemplateTest;
 
 public class MiscErrorMessagesTest extends TemplateTest {
@@ -45,4 +49,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/b246de24/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/core/StringLiteralInterpolationTest.java b/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
index b0d0581..f655865 100644
--- a/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
+++ b/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
@@ -80,7 +80,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