如何在Grails中实现错误处理?

时间:2009-08-18 22:13:27

标签: grails error-handling

显然,我刚刚开始使用Grails。我已经创建了我的域类和控制器,将自己的逻辑添加到控制器中,一切正常 - 只要没有出错。

我的自定义控制器操作如下所示:

def create = {
    try
    {
        // Get the parameters.
        def uid=params["uid"]
        def pwd=params["pwd"]
        if (!uid || !pwd)
        {
            throw new Exception('User ID and password are required')
        }
        /* other code */   
    }
    catch (Exception ex)
    {
        println ex.getMessage()
    }
}

我的代码(/* other code */)运行正常。但是,抛出异常时,错误消息将打印到控制台,浏览器将引发404错误。显然,这不是要走的路。

这样做的正确方法是什么?

TIA,

约翰

3 个答案:

答案 0 :(得分:4)

根据您提供的代码段,我猜您真正想要的是验证某种用户输入(可能是表单)。如果是这种情况,那么抛出异常绝对不是可行的方法。如果发生异常(某些意外情况,通常不应该在正常操作期间发生),那么你应该只抛出异常 - 顺便说一句,这也适用于其他编程语言。

Grails为验证用户输入提供了非常好的支持。根据上下文,您应该在域类中定义约束,或者使用command objects并在那里定义约束(如果要验证的字段不直接由域类支持)。这样Grails会根据您的约束自动验证用户输入(有许多不同的类型,例如大小,空白/非空白,甚至是RegExp约束),并将错误和相应的消息存储在域类中。然后,您可以在表单(视图)中轻松显示相应的本地化错误消息。最好在它们引用的输入字段旁边显示错误。

查看参考文档 - 尤其是chapter 7 (validation)

您获得的404可能不是由于(已捕获)异常,而是因为您没有名为create.gsprender / redirect来电的视图你的行动。

我希望这能回答你的问题,或者至少指出你正确的方向。祝你好运!

答案 1 :(得分:0)

正如Daniel所说,在您的域类中使用约束,并在控制器中使用validate()方法而不是抛出异常。

如果validate()返回false,则再次使用错误消息呈现表单。

答案 2 :(得分:-3)

在BootStrap.groovy文件中,您可以为不同的Java异常设置catch-all处理程序。 Here是关于它的文章。