亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

包裝多個靜態錯誤以用于錯誤。是

包裝多個靜態錯誤以用于錯誤。是

Go
MMMHUHU 2022-08-01 16:52:49
Go 1.13 引入了這些錯誤。是檢查錯誤在其鏈中是否包含目標錯誤的函數:err := fmt.Errorf("access denied: %w", ErrPermission)...if errors.Is(err, ErrPermission) ...此時請注意,只接受一個指令。fmt.Errorf%w現在考慮多個級別的錯誤:第一級:ErrUnexpectedEOF        = errors.New("unexpected EOF")ErrRequiredFieldMissing = errors.New("required field missing")ErrValueOutOfRange      = errors.New("value out of range")第二級:ErrParse = errors.New("parse error")出于這個問題的目的,我將把它放在兩個級別,但請注意,可能存在級別。n如何將一級和二級錯誤鏈接起來,以便在針對第二級或包裝的一級錯誤時返回?errors.Istrue
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

背后的基本原理是創建錯誤層次結構,其中每個錯誤都有一個父級(或者是層次結構的根)。fmt.Errorf


type errorOne struct{}


func (e errorOne) Error() string {

    return "Error One happended"

}


...

    e1 := errorOne{}

    e2 := fmt.Errorf("E2: %w", e1)

    e3 := fmt.Errorf("E3: %w", e2)

您可以使用以下命令檢查一個錯誤是否包裝了另一個錯誤errors.Is


如果你想讓一個錯誤有“多個父項”,那么你可以使用錯誤鏈。它創建一個處理這種情況的自定義類型。ErrorChain


以包 Github 頁面為例


type myError struct {

    code int

}


func (e *myError) Error() string {

    return fmt.Sprintf("%d", e.code)

}


func (e *myError) Is(target error) bool {

    te, ok := target.(*myError)

    if ok == false {

        return false

    }

    return e.code == te.code

}


....


    ec := chain.New()

    ec.Add(errors.New("some error"))

    ec.Add(fmt.Errorf("wrap it up %w", &myError{code: 12}))


查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號