2014-10-02 49 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.我個人保持簡單並記錄下所有的錯誤。