目录
1、Golang error包
内建error接口
// builtin.go type error interface { Error() string }
实现error接口
// errors.go package errors type errorString struct { s string } func (e *errorString) Error() string { return e.s }
2、创建 error
定义
// package errors func New(text string) error {} // package fmt func Errorf(format string, a ...any) error {}
代码示例
package main import ( "errors" "fmt" ) func main() { // 方式一:通过字符串构建 error err := errors.New("error") fmt.Printf("err: %v\n", err) // err: error // 方式二:格式化输出错误字符串 fmtErr := fmt.Errorf("this is a error: %s", "fmt error") fmt.Printf("fmtErr: %v\n", fmtErr) // fmtErr: this is a error: fmt error }
3、错误处理
3.1、抛出错误和处理错误
package main import ( "errors" "fmt" ) // 自定义错误 var DBError = errors.New("DBError") func getRecords() (any, error) { // 抛出错误 return nil, DBError } func main() { // 错误处理 _, err := getRecords() if err != nil { fmt.Printf("err: %v\n", err) } else { fmt.Printf("not err") } // err: DBError }
3.2、errors.Is
package main import ( "errors" "fmt" ) // 自定义错误 var DBError = errors.New("DBError") // 错误包裹 var NotFoundError = fmt.Errorf("%w", DBError) func getRecords() (any, error) { return nil, NotFoundError } func main() { // 错误处理 _, err := getRecords() if err != nil { if errors.Is(err, DBError) { fmt.Println("err Is DBError") } if errors.Is(err, NotFoundError) { fmt.Println("err Is NotFoundError") } } else { fmt.Printf("not err") } // err Is DBError // err Is NotFoundError }
3.3、errors.As
package main import ( "errors" "fmt" ) // 自定义错误 type DBError struct { desc string } func (dbError DBError) Error() string { return dbError.desc } func getRecords() (any, error) { return nil, DBError{ desc: "DBError", } } func main() { // 错误处理 _, err := getRecords() if err != nil { var dbError DBError if errors.Is(err, dbError) { fmt.Println("err Is DBError") } if errors.As(err, &dbError) { fmt.Println("err As NotFoundError") } } else { fmt.Printf("not err") } // err As NotFoundError }
参考