处理多个错误

tom*_*456 4 go

我有功能1:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

和功能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")
    }
}
Run Code Online (Sandbox Code Playgroud)

如何检测发生了什么类型的错误(内部,在db等中找不到结果)然后在功能1中进行相应处理?

Not*_*fer 5

您有3个主要选择:

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

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

例如:

var ErrDB = errors.New("Database Error")
var ErrTimeout = errors.New("Timeout") //or whatever
Run Code Online (Sandbox Code Playgroud)

然后

if err := someFunc(); err != nil {
  switch err {
  case ErrDB:
    //do stuff that needs to be done here
  case ErrTimeout:
    //etc /etc
  }
}
Run Code Online (Sandbox Code Playgroud)
  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}
}
Run Code Online (Sandbox Code Playgroud)

然后当你返回它时,做这样的事情:

// 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
}
Run Code Online (Sandbox Code Playgroud)

并在分析时:

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
       ....
     }  
   }
}
Run Code Online (Sandbox Code Playgroud)