2012-03-18 156 views
3

我从最新的Java开发中了解到,抛出RuntimeException并处理它,面向方面的方式是当前服务层错误处理的趋势。这意味着,如果出现任何问题,您只需抛出一个RuntimeException甚至更​​好,让Bean Validation做到这一点。服务层验证和验证错误

优点是:您不会用try-catchif(entity.getName() == nil)检查堵塞您的代码。一切都在后台进行检查,使您的代码更具可读性。

所以我想知道,这将如何在Grails中完成?当然,如果我使用.save(failOnError:true),我会得到一个不错的ValidationException。但是这会导致一个非常不愉快的默认错误页面,它根本不会改进Web应用程序的可用性。

我还需要将它放在控制器级别的try-catch块中吗?比方说,EntityService有一个方法,它看起来像这样:

def toggleSomething(String entityId) = { 
    if(!someOtherPrerequisite) { 
     throw new EntityException("SomeOtherPrerequisite was not satisfied") // extends RuntimeException 
    } 

    Entity entity = Entity.get(entityId) 
    entity.someProperty = somePropertyValue 
    entity.save(failOnError:true) // throws a ValidationException 
} 

然后,控制器会做叫它像这样:

def toggle = { 
    try { 
     entityService.toggleSomething(params.id) 
    } 
    catch(e) { 
     flashHelper.error 'I'm sorry, something went wrong.' 
    } 
} 

但是,这似乎是很老的学校的时候Grails是太新在许多事情上学校。是不是有办法处理RuntimeExceptions有点更好,而不会堵塞代码try-catch

回答

2

我遵循的模式是:

  1. 如果错误可以在Grails领域内被包裹起来,然后不直接与异常处理应对。如果您的服务方法主要处理您的grails域,那么当出现错误时,它们将在domain.errors集合中结束。在控制器中,只需检查这些错误(hasErrors())。由于无论如何抛出了一个RuntimeException,所以你的事务回滚了,没有伤害,没有犯规。

  2. 如果你正在处理第三方库(可能是外部Web服务或类似的),那么不要害怕异常。仅仅因为Grails(Groovy)不需要你来处理它们,它们仍然很好地使用/使用。

  3. 有时候以上都不适用,也许你的服务方法应该返回一些关于逻辑结果的真或假标志。把你的例子,例如:

服务

def toggleSomething(String entityId) = { 
     if(!someOtherPrerequisite) { 
      return false 
     } 
    } 

     Entity entity = Entity.get(entityId) 
     entity.someProperty = somePropertyValue 
     entity.save() // throws a ValidationException 
     return entity.hasErrors() 
    } 

控制器

def toggle = { 
     if (!entityService.toggleSomething(params.id)) { 
      flashHelper.error 'I'm sorry, something went wrong.' 
     } 
    } 

不幸的是,有可能是没有坚实的正确或错误的方式来处理这一点。所以期待与我不同的答案。

+0

谢谢。我阅读了一些更多的文章,并使其与您的代码示例相似,但是我返回了该服务中具有错误的实体。只要返回,如果它有错误,作为一个布尔值是一个好主意,并且在许多情况下肯定就足够了。 – 2012-03-18 22:44:03

+0

随时接受这个答案。 ;) – Gregg 2012-03-20 13:17:47

+0

的确,我正在等待一些更多的意见,但在我看来,你是SO上唯一的Grails专家。 ;) – 2012-03-20 14:29:59