This is an automated email from the ASF dual-hosted git repository.

ddekany pushed a commit to branch FREEMARKER-35
in repository https://gitbox.apache.org/repos/asf/freemarker.git

commit 9cbf867df3f5d0d824dfa384312af6176f96cb1a
Author: ddekany <[email protected]>
AuthorDate: Sun Nov 7 17:47:45 2021 +0100

    Better error messages in case a custom formatter forgets to wrap a runtime 
exception into TemplateValueFormatException.
---
 src/main/java/freemarker/core/Environment.java  | 36 ++++++++++++++++---------
 src/main/java/freemarker/core/_MessageUtil.java | 33 ++++++++++++++---------
 2 files changed, 44 insertions(+), 25 deletions(-)

diff --git a/src/main/java/freemarker/core/Environment.java 
b/src/main/java/freemarker/core/Environment.java
index ea90bb0..1208e79 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/src/main/java/freemarker/core/Environment.java
@@ -1461,11 +1461,13 @@ public final class Environment extends Configurable {
      */
     Object formatNumber(TemplateNumberModel number, Expression exp, boolean 
useTempModelExc) throws TemplateException {
         TemplateNumberFormat format = getTemplateNumberFormat(exp, false);
+        Object result;
         try {
-            return EvalUtil.assertFormatResultNotNull(format.format(number));
-        } catch (TemplateValueFormatException e) {
+            result = format.format(number);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatNumberException(format, exp, e, 
false);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
@@ -1489,11 +1491,13 @@ public final class Environment extends Configurable {
             TemplateNumberModel number, TemplateNumberFormat format, 
Expression exp,
             boolean useTempModelExc)
             throws TemplateException {
+        String result;
         try {
-            return 
EvalUtil.assertFormatResultNotNull(format.formatToPlainText(number));
-        } catch (TemplateValueFormatException e) {
+            result = format.formatToPlainText(number);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatNumberException(format, exp, e, 
useTempModelExc);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
@@ -1776,11 +1780,13 @@ public final class Environment extends Configurable {
     Object formatDate(TemplateDateModel tdm, Expression blamedTdmSourceExpr, 
boolean useTempModelExc)
             throws TemplateException {
         TemplateDateFormat format = getTemplateDateFormat(tdm, 
blamedTdmSourceExpr, useTempModelExc);
+        Object result;
         try {
-            return EvalUtil.assertFormatResultNotNull(format.format(tdm));
-        } catch (TemplateValueFormatException e) {
+            result = format.format(tdm);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatDateException(format, 
blamedTdmSourceExpr, e, useTempModelExc);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
@@ -1815,11 +1821,13 @@ public final class Environment extends Configurable {
     static String formatDateToPlainText(
             TemplateDateModel tdm, Expression blamedTdmSourceExp, 
TemplateDateFormat format,
             boolean useTempModelExc) throws TemplateException {
+        String result;
         try {
-            return 
EvalUtil.assertFormatResultNotNull(format.formatToPlainText(tdm));
-        } catch (TemplateValueFormatException e) {
+            result = format.formatToPlainText(tdm);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatDateException(format, 
blamedTdmSourceExp, e, useTempModelExc);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
@@ -2257,11 +2265,13 @@ public final class Environment extends Configurable {
     Object formatTemporal(TemplateTemporalModel ttm, Expression 
blamedTtmSourceExp, boolean useTempModelExc)
             throws TemplateException {
         TemplateTemporalFormat format = getTemplateTemporalFormat(ttm, 
blamedTtmSourceExp, useTempModelExc);
+        Object result;
         try {
-            return EvalUtil.assertFormatResultNotNull(format.format(ttm));
-        } catch (TemplateValueFormatException e) {
+            result = format.format(ttm);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatTemporalException(format, ttm, 
blamedTtmSourceExp, e, useTempModelExc);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
@@ -2295,11 +2305,13 @@ public final class Environment extends Configurable {
             TemplateTemporalModel ttm, Expression blamedTtmSourceExp, 
TemplateTemporalFormat ttf,
             boolean useTempModelExc)
             throws TemplateException {
+        String result;
         try {
-            return 
EvalUtil.assertFormatResultNotNull(ttf.formatToPlainText(ttm));
-        } catch (TemplateValueFormatException e) {
+            result = ttf.formatToPlainText(ttm);
+        } catch (Exception e) {
             throw _MessageUtil.newCantFormatTemporalException(ttf, ttm, 
blamedTtmSourceExp, e, useTempModelExc);
         }
+        return EvalUtil.assertFormatResultNotNull(result);
     }
 
     /**
diff --git a/src/main/java/freemarker/core/_MessageUtil.java 
b/src/main/java/freemarker/core/_MessageUtil.java
index 74b4664..0d5093d 100644
--- a/src/main/java/freemarker/core/_MessageUtil.java
+++ b/src/main/java/freemarker/core/_MessageUtil.java
@@ -314,27 +314,32 @@ public class _MessageUtil {
     }
 
     public static TemplateException 
newCantFormatDateException(TemplateDateFormat format, Expression dataSrcExp,
-            TemplateValueFormatException e, boolean useTempModelExc) {
+            Exception formattingException, boolean useTempModelExc) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 "Failed to format date/time/datetime with format ", new 
_DelayedJQuote(format.getDescription()), ": ",
-                e.getMessage())
+                formattingException instanceof TemplateValueFormatException
+                        ? formattingException.getMessage()
+                        : String.valueOf(formattingException))
                 .blame(dataSrcExp); 
         return useTempModelExc
-                ? new _TemplateModelException(e, null, desc)
-                : new _MiscTemplateException(e, null, desc);
+                ? new _TemplateModelException(formattingException, null, desc)
+                : new _MiscTemplateException(formattingException, null, desc);
     }
     
-    public static TemplateException 
newCantFormatTemporalException(TemplateTemporalFormat format, 
TemplateTemporalModel ttm, Expression dataSrcExp,
-            TemplateValueFormatException e, boolean useTempModelExc) {
+    public static TemplateException newCantFormatTemporalException(
+            TemplateTemporalFormat format, TemplateTemporalModel ttm, 
Expression dataSrcExp,
+            Exception formattingException, boolean useTempModelExc) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 "Failed to format temporal value of class ", 
safeGetTemporalClass(ttm),
                         ", value ", new _DelayedJQuote(new 
_DelayedToString(safeGetTemporalValue(ttm))),
                         ", with format ", new 
_DelayedJQuote(format.getDescription()), ": ",
-                e.getMessage())
+                formattingException instanceof TemplateValueFormatException
+                        ? formattingException.getMessage()
+                        : String.valueOf(formattingException))
                 .blame(dataSrcExp);
         return useTempModelExc
-                ? new _TemplateModelException(e, null, desc)
-                : new _MiscTemplateException(e, null, desc);
+                ? new _TemplateModelException(formattingException, null, desc)
+                : new _MiscTemplateException(formattingException, null, desc);
     }
 
     private static String safeGetTemporalClass(TemplateTemporalModel ttm) {
@@ -355,14 +360,16 @@ public class _MessageUtil {
     }
 
     public static TemplateException 
newCantFormatNumberException(TemplateNumberFormat format, Expression dataSrcExp,
-            TemplateValueFormatException e, boolean useTempModelExc) {
+            Exception formattingException, boolean useTempModelExc) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 "Failed to format number with format ", new 
_DelayedJQuote(format.getDescription()), ": ",
-                e.getMessage())
+                formattingException instanceof TemplateValueFormatException
+                        ? formattingException.getMessage()
+                        : String.valueOf(formattingException))
                 .blame(dataSrcExp); 
         return useTempModelExc
-                ? new _TemplateModelException(e, null, desc)
-                : new _MiscTemplateException(e, null, desc);
+                ? new _TemplateModelException(formattingException, null, desc)
+                : new _MiscTemplateException(formattingException, null, desc);
     }
 
     public static TemplateModelException 
newKeyValuePairListingNonStringKeyExceptionMessage(

Reply via email to