标签: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,错误处理 来源: https://www.cnblogs.com/burndust/p/16638010.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。