2014-10-02 57 views
0

我想知道是否有更好的方法来处理应用程序中的错误以进行调试。我想拥有一个像'debug'这样的标志,它会显示函数返回的真实错误(例如sql)。如果没有设置,我希望它返回一个通用消息。在Go中处理调试错误

我做的东西,在这里工作是这样的: 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响应,这就是为什么它是一个地图。

回答

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 
} 

playground

2

您可以创建包含您的DISPLA一个DebugError型y和调试错误,这种类型也会实现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.我个人保持简单并记录下所有的错误。