【问题标题】:Handling exceptions with in velocity template使用速度模板处理异常
【发布时间】:2016-02-20 17:27:52
【问题描述】:

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

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

感谢您的澄清

【问题讨论】:

    标签: velocity


    【解决方案1】:

    模板本身没有异常流控制处理。如果抛出异常,当前模板的渲染将停止,异常将被记录并显示在输出中。总体理念是尝试包含 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
    

    【讨论】:

    • 谢谢它的工作。但我需要将我的事件处理程序注册到 EventCartridge
    猜你喜欢
    • 2019-10-11
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多