处理多个错误

时间:2015-05-21 18:06:43

标签: go

我有功能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中进行相应处理?

1 个答案:

答案 0 :(得分:5)

您有3个主要选项:

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

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

  3. 例如:

    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. 创建自定义错误类型,因为错误只是接口,可以包含一些标识符或其他上下文数据。
    2. 例如:

      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
             ....
           }  
         }
      }