首页 > 其他分享 >go语言的错误处理(自定义错误类型, wrap error)

go语言的错误处理(自定义错误类型, wrap error)

时间:2022-08-30 07:55:54浏览次数:54  
标签:return 自定义 err AppError fmt func error wrap 错误处理

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

相关文章