使用 in velocity 模板处理异常
Handling exceptions with in velocity template
当我在一个循环中处理 100 条记录时,如何使用 in velocity 模板处理异常。如果我在处理一条记录时遇到异常,那么我应该能够继续处理下一条记录。这是否可以通过速度模板实现,或者需要在 java.
中处理
使用速度模板时处理异常的最佳方法是什么?
感谢您的澄清
模板本身内部没有异常流控制处理。如果抛出异常,当前模板的渲染将停止,异常将被记录并显示在输出中。总体理念是尝试包含 Java 对象方法的异常。
例如,不用将 Object MyObject.mayThow()
暴露到模板中,您可以使用包装器:
class MyWrapper
{
bool doesntThrow()
{
try
{
return mayThrow()
}
catch (MyException e)
{
// log it if necessary
return null
}
}
}
并且在模板中:
#foreach($i in $items)
## ...
#set ($obj = $i.doesntThrow())
#if($obj)
## ...
#end
#end
除了包装器,您还可以使用 MethodExceptionEventHandler
:
package mypackage;
import org.apache.velocity.app.event.MethodExceptionEventHandler;
public class MyHandler implements MethodExceptionEventHandler
{
public Object methodException(Class claz, String method, Exception e) throws Exception
{
// for instance, return null as a convention
if (claz == MyObject.class && method.equals("doesThrow")) return null;
// something else happened...
else throw e;
}
}
然后可以直接在模板中调用mayThrow()
:
#foreach($i in $items)
## ...
#set ($obj = $i.mayThrow())
#if($obj)
## ...
#end
#end
当然,您必须在 velocity.properties
文件中注册您的事件处理程序:
eventhandler.methodexception.class = mypackage.MyHandler
当我在一个循环中处理 100 条记录时,如何使用 in velocity 模板处理异常。如果我在处理一条记录时遇到异常,那么我应该能够继续处理下一条记录。这是否可以通过速度模板实现,或者需要在 java.
中处理使用速度模板时处理异常的最佳方法是什么?
感谢您的澄清
模板本身内部没有异常流控制处理。如果抛出异常,当前模板的渲染将停止,异常将被记录并显示在输出中。总体理念是尝试包含 Java 对象方法的异常。
例如,不用将 Object MyObject.mayThow()
暴露到模板中,您可以使用包装器:
class MyWrapper
{
bool doesntThrow()
{
try
{
return mayThrow()
}
catch (MyException e)
{
// log it if necessary
return null
}
}
}
并且在模板中:
#foreach($i in $items)
## ...
#set ($obj = $i.doesntThrow())
#if($obj)
## ...
#end
#end
除了包装器,您还可以使用 MethodExceptionEventHandler
:
package mypackage;
import org.apache.velocity.app.event.MethodExceptionEventHandler;
public class MyHandler implements MethodExceptionEventHandler
{
public Object methodException(Class claz, String method, Exception e) throws Exception
{
// for instance, return null as a convention
if (claz == MyObject.class && method.equals("doesThrow")) return null;
// something else happened...
else throw e;
}
}
然后可以直接在模板中调用mayThrow()
:
#foreach($i in $items)
## ...
#set ($obj = $i.mayThrow())
#if($obj)
## ...
#end
#end
当然,您必须在 velocity.properties
文件中注册您的事件处理程序:
eventhandler.methodexception.class = mypackage.MyHandler