我知道如何在 Grails 中使用 UrlMappings 和 ErrorController 进行通用异常处理以进行通用异常处理,因此如果异常逃脱控制器,用户将被发送到通用错误页面并记录异常。我也知道如何使用 try/catch 块来处理特定的异常并尝试从中恢复。
但是在大多数控制器中,如果发生异常,我只想给用户一个稍微更具体的错误消息。所以在创建动作中,我想告诉用户该项目没有被创建。或者在导入动作中,我想告诉用户导入失败。现在,控制器看起来像:
class ThingController {
def create = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to create the Thing")
}
}
def delete = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to delete the Thing")
}
}
private void handleException(Exception e, String message) {
flash.message = message
String eMessage = ExceptionUtils.getRootCauseMessage(e)
log.error message(code: "sic.log.error.ExceptionOccurred", args: ["${eMessage}", "${e}"])
redirect(action:index)
}
}
请注意,catch 块不会根据异常的类型或内容做任何不同的事情。他们只是根据控制器提供更具描述性的错误消息。“真正的”控制器代码通常是 6-10 行,因此为了更改错误消息而额外增加 4 行代码似乎过多。此外,CodeNarc“CatchException”规则抱怨,这强化了我的观点,即必须有更好的方法来做到这一点。我假设其他 Grails 应用程序也有类似的要求。根据异常冒出的操作来指定不同错误消息的惯用方法是什么?
我对来自解决这个问题的特定方法的经验的答案感兴趣,或者更好的是,链接到我可以在实践中看到解决方案的代码库。