【问题标题】:Handling multiple errors处理多个错误
【发布时间】:2015-05-21 18:06:43
【问题描述】:

我有功能1:

func Function1() {
    if err := Function2(); err != nil {

    }
}

和功能2:

func Function2() error {
    if err := doSomethingThatMightCauseError(); err != nil {
        return errors.New("Error Type 1")
    }

    if err := doSomethingElseThatMightCauseError(); err != nil {
        return errors.New("Error Type 2")
    }
}

如何检测发生了哪种类型的错误(内部错误,在 db 中未找到结果等),然后在函数 1 中进行相应处理?

【问题讨论】:

标签: go


【解决方案1】:

您有 3 个主要选项:

  1. 基于字符串,即查看消息。这当然很糟糕,因为如果你以后更改消息中的一个字母,你需要重写所有的检查代码,所以我会避免它。

  2. 如果错误消息可以保持不变,只需将错误创建为全局变量,然后将收到的错误与已知的预定义错误进行比较。

例如:

var ErrDB = errors.New("Database Error")
var ErrTimeout = errors.New("Timeout") //or whatever

然后

if err := someFunc(); err != nil {
  switch err {
  case ErrDB:
    //do stuff that needs to be done here
  case ErrTimeout:
    //etc /etc
  }
}
  1. 创建自定义错误类型,因为错误只是接口,可以有一些标识符或其他上下文数据。

例如:

const (
  ErrDB = 1
  ErrTimeout = 2
  ...
)

type MyError struct {
   Code int
   Message string
}

// This is what you need to be an error
func (e MyError)Error() string {
   return e.Message
}


func NewError(s string, code int) error {
   return MyError{s,code}
}

然后当您返回它时,请执行以下操作:

// Return a MyError with a DB code for db operations
func someFunc() error {
   if err := talkToDB(); err != nil {
      return NewError(err.Error(), ErrDB)
   }
   return nil
}

在分析时:

if err := someFunc(); err != nil {

   // check if this is a MyError
   if me, ok := err.(MyError); ok {
     // now we can check the code
     switch me.Code {
       case ErrDB:
         //handle this
       ....
     }  
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多