【发布时间】:2014-11-04 13:56:36
【问题描述】:
我正在用 Go 编写我的 Web 应用程序。我想将大部分错误从 API 转换为恐慌,然后在更高级别的函数中捕获这些恐慌,记录它们并将错误页面返回给用户。
类似这样的:
func Handler(body func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
return func(responseWriter http.ResponseWriter, request *http.Request) {
defer recoverIfPanic(responseWriter, request)
body(responseWriter, request)
}
}
func recoverIfPanic(responseWriter http.ResponseWriter, request *http.Request) {
reason := recover()
if reason == nil {
return
}
// log and return http error
}
func PanicIf(err error, httpStatus int, description string) {
if error != nil {
panic(MyPanicStruct{err: err, httpStatus: httpStatus, description: description})
}
}
在我的实际代码中
result, err := SomeApi(...)
PanicIf(err, http.StatusInternalServerError, "SomeApi")
在 99% 的情况下,我无法做任何合理的事情,例如SQL 服务器返回意外错误或文件系统丢失文件,我只想记录这种情况并将错误返回给用户。所以我看不出我应该手动返回“err”展开堆栈的任何原因,实际上我会丢失堆栈跟踪和上下文,并且更难找到错误原因。
有什么我想念的,所以这种方法不能很好地工作吗?似乎大多数 Go 文章都建议不要使用恐慌/恢复,但我不明白为什么。它看起来与 Java(和类似语言)中良好的老式 throw-catch 机制一模一样,并且非常适用于 Web 应用程序。
【问题讨论】:
标签: web-applications error-handling go