我想知道是否有更好的方法来处理应用程序中的错误以进行调试。我希望有一个像'debug'设置的标志,它将显示从函数返回的实际错误(例如来自sql)。如果未设置,我希望它返回一般信息。
我在这里做了一些这样的工作: http://play.golang.org/p/YDeqVvRSMd
一般的想法是我将真正的错误和我的库存错误传递给一个函数,并检查是否设置了调试:
func ErrorMsg(debug, error_type error) map[string]interface{} {
var msg error
if Debug {
msg = debug
} else {
msg = error_type
}
err := map[string]interface{}{"error_message": msg}
return err
}
然而,这似乎是一个丑陋的解决方案。有没有更好的方法来实现这一目标?
此外,我想返回一个JSON响应,这就是为什么它是一张地图。
答案 0 :(得分:2)
Go是一种非常冗长的语言,你可以用很少的东西来清理这些代码,这里有一个更短的版本:
func ErrorMsg(debug, error_type error) map[string]interface{} {
msg := error_type
if Debug {
msg = debug
}
return map[string]interface{}{"error_message": msg}
}
或者您可以将所有地图放在一起并直接返回错误并在错误结构上设置json标记:
type RequestError struct {
ErrorString string `json:"error_message"`
}
func ErrorMsg(debug, error_type error) (err error) {
err = error_type
if Debug {
err = debug
}
return
}
答案 1 :(得分:2)
您可以创建一个包含显示和调试错误的DebugError
类型,此类型也会实现Error接口。然后你可以使用辅助函数来打印错误。
package main
import (
"errors"
"fmt"
)
var ErrInternal = errors.New("Internal Server Error")
type DebugError struct {
Display error
Debug error
}
// Error implements the error interface
// Uses the Display error
func (err DebugError) Error() string {
return err.Display.Error()
}
func main() {
err := someSqlCall()
if err != nil {
// debug error
fmt.Println(getError(err, true))
// display error
fmt.Println(getError(err, false))
}
}
// mock sql function
func someSqlCall() error {
return DebugError{
Display: ErrInternal,
Debug: errors.New("Real sql error goes here"),
}
}
// getError is a helper function that returns a debug or display error
func getError(err error, debug bool) error {
debugErr, ok := err.(DebugError)
if !ok {
// not a debug error
return err
}
if debug {
return debugErr.Debug
}
return debugErr.Display
}
转到play。
P.S。就个人而言,我保持简单并记录我的所有错误。