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")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!