要点

  • error是一个预定义的interface

    1
    2
    3
    type error interface {
    Error() string
    }
  • 最常用的一个实现是errors中的errorString

    1
    errors.New("error message")
  • fmt包中,通过反射得知是error类型时,则调用error() string方法

  • fmt包中,提供了Errorf(format string, a ...interface{}) error来方便错误信息输出

  • 在精细化的情况下(调用者需要知道错误(该错误是重新定义的的,包含其他信息)的详细信息,不只是错误字符串),
    这时可以通过类型断言来单独处理指定错误

    1
    2
    3
    4
    5
    6
    7
    if err := dec.Decode(&val); err != nil {
    if serr, ok := err.(*json.SyntaxError); ok {
    line, col := findLine(f, serr.Offset)
    return fmt.Errorf("%s:%d:%d: %v", f.Name(), line, col, err)
    }
    return err
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    _, err := my.DB.Exec(sql)
    if err != nil {
    if driverErr, ok := err.(*mysql.MySQLError); ok { // Now the error number is accessible directly
    if driverErr.Number == 1062 {
    return errDuplicate
    }
    }
    return &json2.Error{Code: 100, Message: "a"}
    }

参考

  1. http://blog.golang.org/error-handling-and-go

留言

2015-09-24