【发布时间】:2014-09-30 23:35:36
【问题描述】:
在 Django 中,有几个异常被设计为被框架拦截并转化为特定的 HTTP 响应代码,例如 404 Not Found 和 403 Forbidden。
这对于请求验证特别有用,因为它允许您将常见的验证逻辑分解到实用程序函数中并清理您的控制器操作。
当实用程序函数决定必须使用特定 HTTP 错误代码中止当前请求时,它们可以通过抛出相关异常来实现,控制器操作中没有任何支持代码, return 语句或 try/catch 的形式。
例如,给定一棵嵌套的 REST 资源树:
static mappings = {
"/authors" (resources: "author") {
"/sagas" (resources: "saga") {
"/books" (resources: "book") {
}
}
}
那么 Book 资源的 URL 模式是 /authors/$authorId/sagas/$sagaId/books/$id,这意味着 BookController 中的任何 show()、delete() 或 update() 操作都具有此签名,并且必须包含一些样板验证逻辑:
def actionName(int authorId, int sagaId, Book book) {
// -- common validation logic ----------
// fetch parent objects
def author = Author.get(authorId)
def saga = Saga.get(sagaId)
// check that they exists
if (author == null || saga == null || book == null) {
return render(status: NOT_FOUND)
}
// check consistency
if (book.author != author || book.saga != saga || saga.author != author) {
return render(status: BAD_REQUEST)
}
// -- end of commond code --------------
...
}
Grails 以什么方式将其分解为一个通用方法,同时仍然允许它在异常情况发生时终止请求处理?
我认为最好的方法是 NotFoundException、ForbiddenException、BadRequestException 等,或者可能是接受 HTTP 状态代码的通用异常。 Grails中有类似的东西吗?如果没有,添加它的最佳位置在哪里?过滤器?
编辑:我现在看到标准方法是添加一个带有匹配 URL 模式的错误控制器,例如:
"500" (controller: "error")
问题在于 Grails 仍会为所有异常记录完整的堆栈跟踪,包括那些不是编程错误的异常。这种垃圾邮件日志文件包含各种无用的回溯。
有解决办法吗?
【问题讨论】:
标签: exception grails dry http-status-codes