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

go语言的错误处理没有其他语言的try,catch,finally异常捕获机制,需要显式地进行错误处理,如果只是单纯地将错误返回,在深度过大时可能无法清楚地知道调用的链路。这时候可以通过自定义错误类型,包装错误(wrap error)进行处理,在发生错误时返回带上调用链路。

package main

import (
	"errors"
	"fmt"
)

type AppError struct {
	AppMessage string
	Message    string
}

func (e *AppError) Error() string {
	return fmt.Sprintf("%s:%s", e.AppMessage, e.Message)
}

func (e *AppError) GetMessage() string {
	return e.Message
}

func (e *AppError) GetAppMessage() string {
	return e.AppMessage
}

func NewAppError(appMessage string, message string) error {
	return &AppError{
		AppMessage: appMessage,
		Message:    message,
	}
}

func main() {
	var err error
	var e *AppError
	err = A()
	if v, ok := err.(*AppError); ok {
		fmt.Println("assert-a", v.GetMessage(), v.Error()) // wrap error 断言无法成功,无输出
	}
	if errors.As(err, &e) {
		fmt.Println("as-a", e.GetMessage(), e.Error()) // as-a message appMessage:message
	}
	fmt.Println("a", err.Error()) // a b:appMessage:message

	err = C()
	if v, ok := err.(*AppError); ok {
		fmt.Println("assert-c", v.GetMessage(), v.Error())
	}
	if errors.As(err, &e) {
		fmt.Println("as-c", e.GetMessage(), 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("appMessage", "message")
}

func C() error {
	err := D()
	return fmt.Errorf("d:%w", err)
}

func D() error {
	return errors.New("serverError")
}
posted @   burndust  阅读(227)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示