Exception handling 当未找到布局时,如何在Liferay Velocity主题中捕获NoSuchLayoutException?

Exception handling 当未找到布局时,如何在Liferay Velocity主题中捕获NoSuchLayoutException?,exception-handling,liferay,velocity,liferay-6,liferay-velocity,Exception Handling,Liferay,Velocity,Liferay 6,Liferay Velocity,我在velocity模板主题中有以下代码: #set($currLayout = $layoutLocalService.getFriendlyURLLayout($group_id, true, $currFriendlyUrl)) 它抛出了一个 com.liferay.portal.NoSuchLayoutException at com.liferay.portal.service.impl.LayoutLocalServiceImpl.getFriendlyURLLayout(

我在velocity模板主题中有以下代码:

#set($currLayout = $layoutLocalService.getFriendlyURLLayout($group_id, true, $currFriendlyUrl))
它抛出了一个

com.liferay.portal.NoSuchLayoutException
    at com.liferay.portal.service.impl.LayoutLocalServiceImpl.getFriendlyURLLayout(LayoutLocalServiceImpl.java:959)
当匹配布局不存在时


如何在velocity模板中捕获此异常?

据我所知,在velocity模板中捕获异常是不可能的。一般来说,有两种方法来处理这种情况:

  • 在使用模板的应用程序中处理异常,例如servlet
  • 避免抛出异常;相反,让该方法始终返回有效(默认)值,如果不可能,则返回
    null

建议尽可能使用第二个选项。

你说得对。经过一些研究,我发现在velocity模板中捕获异常是不可能的。另一方面,我发布的方法“$layoutLocalService.getFriendlyURLLayout”是Liferay的方法,我无法控制它的行为,如果布局不存在,它会抛出异常。因此,一个解决方案是尝试以某种方式重写此方法,或者创建一个钩子重写liferay中的某个servlet。我最后采用的另一种方法是尝试确保所有布局都存在,将此代码放入条件语句中。我只是想知道是否存在一种更直接、更安全的方法来处理此类情况。无论如何,非常感谢你的回答!我觉得你的解决方案不错,但我对Liferay不熟悉。也许可以定义一个默认布局?总的来说听起来是个好主意,谢谢。这可能是liferay人员的另一个问题,是否可以设置默认布局。尽管从liferay API来看,它似乎不受开箱即用的支持。在Liferay中,您可以依赖fetch*()方法,因为它不会引发异常,如果找不到结果,则返回null。