使用速度模板处理异常

Nag*_*esh 2 velocity

当我处理循环中的100条记录时,如何使用速度模板处理异常.如果我在处理一条记录时遇到异常,那么我应该能够继续下一条记录.这是否可以使用速度模板,或者需要在java中处理.

使用速度模板时处理异常的最佳方法是什么?

谢谢你的澄清

Cla*_*son 5

模板本身内部没有异常流控制处理.如果抛出异常,将停止呈现当前模板,并将记录异常并在输出中显示.总体思路是尝试包含Java对象方法的异常.例如Object MyObject.mayThow(),您可以使用包装器而不是暴露到模板中:

class MyWrapper
{
    bool doesntThrow()
    {
        try
        {
            return mayThrow()
        }
        catch (MyException e)
        {
            // log it if necessary
            return null
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在模板中:

#foreach($i in $items)
    ## ...
    #set ($obj = $i.doesntThrow())
    #if($obj)
        ## ...
    #end
#end
Run Code Online (Sandbox Code Playgroud)

您也可以使用以下代码而不是包装器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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以直接调用mayThrow()模板:

#foreach($i in $items)
    ## ...
    #set ($obj = $i.mayThrow())
    #if($obj)
        ## ...
    #end
#end
Run Code Online (Sandbox Code Playgroud)

当然,您必须在velocity.properties文件中注册您的事件处理程序:

eventhandler.methodexception.class = mypackage.MyHandler
Run Code Online (Sandbox Code Playgroud)