Skip to content

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

Is

是不是某个错误

go
func Is(err, target error) bool

Is 能顺着链找

As

能不能转成某种类型

go
func As(err error, target any) bool

如果能够成立,就将 err -> target