第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Go - 如何組合多個錯誤對象

Go - 如何組合多個錯誤對象

Go
繁星淼淼 2022-10-24 09:55:04
假設(shè)我有以下代碼:package libimport (    "errors"    "strconv")var ErrSomething = errors.New("foobar")func SomeFunc(str string) (int, error) {    i, err := strconv.Atoi(str)    if err != nil {        // how to combine ErrSomething with err?        return 0, fmt.Errorf("%w: %w", ErrSomething, err)    }        // do other things, potentially return other errors    return i}如何將返回的錯誤strconv.Atoi與我的命名錯誤結(jié)合起來ErrSomething。組合的原因是我的用戶SomeFunc()可以使用我的錯誤“常量”檢查到底出了什么問題,同時不會丟失有關(guān)潛在錯誤的信息。我讀過類似的問題,但通常的答案是這樣做:return 0, fmt.Errorf("foobar: %w", err)但是這樣我的用戶就無法使用檢查錯誤errors.Is(err, ???)
查看完整描述

1 回答

?
富國滬深

TA貢獻1790條經(jīng)驗 獲得超9個贊

Is您可以通過創(chuàng)建實現(xiàn)和方法的錯誤類型來實現(xiàn)所需的行為,Unwrap如下所示:


package lib


import (

    "fmt"

    "strconv"

)


type FoobarError struct {

    msg      string

    original error

}


func (err *FoobarError) Error() string {

    return fmt.Sprintf("%s: %s", err.msg, err.original.Error())

}


func (err *FoobarError) Unwrap() error {

    return err.original

}


func (err *FoobarError) Is(target error) bool {

    _, ok := target.(*FoobarError)

    return ok

}


func SomeFunc() error {

    // strconv.ErrSyntax is used as a dummy error here for the error

    // that might be returned by strconv.Atoi or any other operation.

    err := strconv.ErrSyntax

    return &FoobarError{"foobar", err}

}

用法:


package main


import (

    "errors"

    "fmt"

    "strconv"


    "lib"

)


func main() {

    if err := lib.SomeFunc(); err != nil {

        fmt.Println(err)                                // foobar: invalid syntax

        fmt.Println(errors.Is(err, &lib.FoobarError{})) // true

        fmt.Println(errors.Is(err, strconv.ErrSyntax))  // true

    }

}

您可以在此處閱讀有關(guān)此方法的更多信息。


獎金

與 Go 的os.IsExist類似,您可能有興趣在庫中添加一個幫助函數(shù),以便用戶更輕松地檢查錯誤:


package lib


import (

  "errors"

  // ...

)


// ...


func IsFoobar(err error) bool {

    return errors.Is(err, &FoobarError{})

}


用法:


package main


// ...


func main() {

    err := lib.SomeFunc(); 

    if lib.IsFoobar(err) {

      // ...

    }

}


查看完整回答
反對 回復(fù) 2022-10-24
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號