go语言的错误处理没有其他语言的try,catch,finally异常捕获机制,需要显式地进行错误处理,如果只是单纯地将错误返回,在深度过大时可能无法清楚地知道调用的链路。这时候可以通过自定义错误类型,包装错误(wrap error)进行处理,在发生错误时返回带上调用链路。
package main
import (
"errors"
"fmt"
)
type AppError struct {
message string
s string
}
func (e *AppError) Error() string {
return e.s
}
func (e *AppError) Msg() string {
return e.message
}
func NewAppError(msg string, s string) error {
return &AppError{
message: msg,
s: s,
}
}
func main() {
var err error
var e *AppError
err = A()
if v, ok := err.(*AppError); ok {
fmt.Println("assert-a", v.Msg(), v.Error()) // wrap error 断言无法成功,无输出
}
if errors.As(err, &e) {
fmt.Println("as-a", e.Msg(), e.Error()) // as-a msg e
}
fmt.Println("a", err.Error()) // a b:e
err = C()
if v, ok := err.(*AppError); ok {
fmt.Println("assert-c", v.Msg(), v.Error())
}
if errors.As(err, &e) {
fmt.Println("as-c", e.Msg(), e.Error())
}
fmt.Println("c", err.Error()) // c d:serverError
}
func A() error {
err := B()
// 在返回错误时体现调用的链路
return fmt.Errorf("b:%w", err)
}
func B() error {
return NewAppError("msg", "e")
}
func C() error {
err := D()
return fmt.Errorf("d:%w", err)
}
func D() error {
return errors.New("serverError")
}
标签:return,自定义,err,AppError,fmt,func,error,wrap,错误处理
From: https://www.cnblogs.com/burndust/p/16638010.html