error
Go 的设计者(Rob Pike)明确说过:
“错误不是异常,它们是程序逻辑的一部分”
错误要被“看见”,但不一定要被“消灭”。
Go is not about avoiding errors. Go is about respecting errors.
Go 不是避免错误,而是尊重错误。
error 是一个接口类型,只要实现了 Error() string 方法,就可以当作 error 使用。
nil 和 error
go
var e *argError = nil
var err error = e
fmt.Println(err == nil) // false ❗error 是接口,接口 = (type, value)
只要 type 不为 nil,接口就不为 nil
warp
有 Unwrap() 或者 %w
go
err := sql.ErrNoRows
err = fmt.Errorf("query user: %w", err)
err = fmt.Errorf("service layer: %w", err)
err = fmt.Errorf("http handler: %w", err)http handler
└─ service layer
└─ query user
└─ sql.ErrNoRowsIs
是不是某个错误
go
func Is(err, target error) boolIs 能顺着链找
As
能不能转成某种类型
go
func As(err error, target any) bool如果能够成立,就将 err -> target