如何自定义/替换 Freemarker 中的异常消息以使其更有意义?
How to customize / replace exception messages in Freemarker to make them more meaningful?
我想 "improve" 一些 Freemarker 模板消息抛出的异常消息,以使异常对用户更有意义。尽管 Freemarker 在有意义的错误消息方面已经变得更好,但在某些情况下,我想更具体一些。
例子
Freemarker 正在为这样的模板抛出此异常:
<#if (""?number > 1)>foo</#if>
(只是一个例子...假设空字符串也可以是一个包含空字符串的变量)
的值templateException.getMessage():
(java.lang.String) Can't convert this string to number: ""
The blamed expression:
==> ""?number [in nameless template at line 1, column 7]
----
FTL stack trace ("~" means nesting-related):
- Failed at: #if (""?number > 1) [in nameless template at line 1, column 1]
----
我想将这个具体案例改写为:
You tried to convert an EMPTY string variable to a number.
我可以尝试自己的异常处理程序,以包含检查、替换消息并重新抛出异常,如下所示:
configuration.setTemplateExceptionHandler(new TemplateExceptionHandler() {
public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)
throws TemplateException {
String message = te.getMessage();
if(StringUtils.contains(message, "Can't convert this string to number: \"\"")){
message = StringUtils.replace(message, "Can't convert this string to number: \"\"", "You tried to convert an EMPTY string variable to a number. Solution: Try checking if the variable is empty to avoid this error.");
}
throw new TemplateException(message, env);
}
});
但这感觉很hacky。
我的问题:
有没有办法自定义 Freemarker 抛出的异常消息?我在我的 TemplateExceptionHandler 中感觉为时已晚,因为消息在 Freemarker 中构建得更早。
改进/重写来自第 3 方库的异常消息的常用方法是什么?
搜索和替换在版本更新后可能无法使用,因为没有关于消息内容的向后兼容性承诺。
如果您想要的更改通常有用(不仅对您的项目),那么您可以通过为 FreeMarker 做出贡献来改进现有的错误消息(签署 Apache CLA,在 GitHub 上分叉,提出拉取请求) .
我看到的唯一真正正确和灵活的方法是向错误消息机制添加 l10n 支持,其中消息字符串没有硬连接到代码中(除了它们的默认值),而是基于消息检索来自外部源的密钥。当然,这可能是一项艰巨的工作,尤其是当 FreeMarker 消息由许多较小的片段组合而成时。
我想 "improve" 一些 Freemarker 模板消息抛出的异常消息,以使异常对用户更有意义。尽管 Freemarker 在有意义的错误消息方面已经变得更好,但在某些情况下,我想更具体一些。
例子 Freemarker 正在为这样的模板抛出此异常:
<#if (""?number > 1)>foo</#if>
(只是一个例子...假设空字符串也可以是一个包含空字符串的变量)
的值templateException.getMessage():
(java.lang.String) Can't convert this string to number: ""
The blamed expression:
==> ""?number [in nameless template at line 1, column 7]
----
FTL stack trace ("~" means nesting-related):
- Failed at: #if (""?number > 1) [in nameless template at line 1, column 1]
----
我想将这个具体案例改写为:
You tried to convert an EMPTY string variable to a number.
我可以尝试自己的异常处理程序,以包含检查、替换消息并重新抛出异常,如下所示:
configuration.setTemplateExceptionHandler(new TemplateExceptionHandler() {
public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out)
throws TemplateException {
String message = te.getMessage();
if(StringUtils.contains(message, "Can't convert this string to number: \"\"")){
message = StringUtils.replace(message, "Can't convert this string to number: \"\"", "You tried to convert an EMPTY string variable to a number. Solution: Try checking if the variable is empty to avoid this error.");
}
throw new TemplateException(message, env);
}
});
但这感觉很hacky。
我的问题:
有没有办法自定义 Freemarker 抛出的异常消息?我在我的 TemplateExceptionHandler 中感觉为时已晚,因为消息在 Freemarker 中构建得更早。
改进/重写来自第 3 方库的异常消息的常用方法是什么?
搜索和替换在版本更新后可能无法使用,因为没有关于消息内容的向后兼容性承诺。
如果您想要的更改通常有用(不仅对您的项目),那么您可以通过为 FreeMarker 做出贡献来改进现有的错误消息(签署 Apache CLA,在 GitHub 上分叉,提出拉取请求) .
我看到的唯一真正正确和灵活的方法是向错误消息机制添加 l10n 支持,其中消息字符串没有硬连接到代码中(除了它们的默认值),而是基于消息检索来自外部源的密钥。当然,这可能是一项艰巨的工作,尤其是当 FreeMarker 消息由许多较小的片段组合而成时。