【问题标题】:Handling errors for debugging in Go处理 Go 中的调试错误
【发布时间】:2014-11-27 20:49:51
【问题描述】:

我想知道是否有更好的方法来处理应用程序中的错误以进行调试。我想设置一个像“调试”这样的标志,它将显示函数返回的真实错误(例如从 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 响应,这就是为什么它是一张地图。

【问题讨论】:

    标签: json http error-handling go


    【解决方案1】:

    Go 是一种非常冗长的语言,您无法清理该代码,这里有一个更短的版本:

    func ErrorMsg(debug, error_type error) map[string]interface{} {
        msg := error_type
        if Debug {
            msg = debug
        }
        return map[string]interface{}{"error_message": msg}
    }
    

    或者你可以把map全部丢掉,直接返回错误,并在错误结构上设置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】:

      您可以创建一个包含显示和调试错误的DebugError 类型,该类型还将实现错误接口。然后你可以使用辅助函数来打印错误。

      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。

      附:就我个人而言,我保持简单并记录我的所有错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多