go语言错误
type error interface{ Error() string}
if err!=nil
errors.New 创建error
package mainimport ( "errors" "fmt" "strings")func validateArgs(name string) (ok bool, err error) { if strings.HasPrefix(name, "mysql") { return true, nil } else { return false, errors.New("name must startwith mysql") }}func main() { s1 := "mysql-abc" s2 := "redis-abc" _, err := validateArgs(s1) if err != nil { fmt.Println("[s1 validate 失败]", err) } _, err = validateArgs(s2) if err != nil { fmt.Println("[s2 validate 失败]", err) }}
复杂的错误类型
- 以os包举例 提供了 LinkError、PathError、SyscallError
- 上述error都是实现了error接口的错误类型
- 可以用switch err.(type)判断类型
package mainimport ( "fmt" "log" "os")func main() { file, err := os.Stat("test.txt") if err != nil { switch err.(type) { case *os.PathError: log.Printf("PathError") case *os.LinkError: log.Printf("LinkError") case *os.SyscallError: log.Printf("SyscallError") default: log.Printf("unknown error") } } else { fmt.Println(file) }}
自定义error
- errors.New 单独的error ,基础的error
- 自定义结构体 ,再原始错误的基础上再封自己的错误信息
- 如下
package mainimport ( "errors" "fmt")type MyError struct { err error msg string // 自定义的error字符串}func (e *MyError) Error() string { return e.err.Error() + e.msg}func main() { err := errors.New("原始的错误") newErr := MyError{ err: err, msg: "[是研发的锅]", } fmt.Println(newErr.Error())}
golang 1.13中的Error Wrapping 错误嵌套
- 目的是很上面的一样 ,扩展error信息
- 使用 fmt.ErrorF(newErrorStr %w,e)
- 好处就是不需要像上面一样定义结构体了,代码如下
package mainimport ( "errors" "fmt")func main() { e := errors.New("原始错误01") w := fmt.Errorf("Wrap了一个新的错误 :%w", e) fmt.Println(w)}