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

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

Go - 如何子類型包裝的錯誤類?

Go - 如何子類型包裝的錯誤類?

Go
繁星點點滴滴 2022-09-26 20:28:54
我正在包裝錯誤(添加上下文),然后區(qū)分兩個錯誤。這是我目前用于測試的方案。(函數(shù)是否正確識別錯誤?我的問題是我如何減少冗長。我有兩個創(chuàng)建不同錯誤的函數(shù):func a() error {    return errors.New("a")}func b() error {    return errors.New("b")}它們都由傳播erorr的第三個函數(shù)調(diào)用。func doStuff() error {    err := a()    if err != nil {        return WrapA{err}    }    err = b()    if err != nil {        return WrapB{err}    }    return nil}在我的主要功能中,我區(qū)分了這兩個錯誤。func main() {    fmt.Println("Hello, playground")    err := doStuff()        switch err.(type) {        case WrapA:            fmt.Println("error from doing a")        case WrapB:             fmt.Println("error from doing b")        case nil:            fmt.Println("nil")        default:            fmt.Println("unknown")    }}目前為止,一切都好。不幸的是,要實現(xiàn) 和 ,我需要大量的代碼:WrapAWrapBtype WrapA struct {    wrappedError error}func (e WrapA) Error() string {    return e.wrappedError.Error()}func (e WrapA) Unwrap() error {    return e.wrappedError}type WrapB struct {    wrappedError error}func (e WrapB) Error() string {    return e.wrappedError.Error()}func (e WrapB) Unwrap() error {    return e.wrappedError}在其他語言中,我會創(chuàng)建一個單一的結(jié)構,并讓和繼承自。但是我看不出有什么辦法可以在Go中做到這一點。WrapWrapAWrapBWrap關于如何減少混亂的任何想法?圍棋游樂場 https://play.golang.org/p/ApzHC_miNyV編輯:在看到jub0bs的答案后,我想澄清:兩者都是我無法控制的回調(diào)。它們可能會返回各種錯誤。這就是我包裝它們的原因。a()b()
查看完整描述

3 回答

?
楊魅力

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

如果我正確地理解了這個問題,你確實可以簡化事情:

  • 定義 和 作為包級變量,以便于使用和提高性能。aberror

  • 除非需要以編程方式訪問只能在要包裝的錯誤上下文中訪問的值,否則很可能不需要聲明這些自定義類型和錯誤類型。相反,您可以簡單地將 %w 謂詞與 fmt 結(jié)合使用。Errorf 以生成包裝較低級別錯誤的新錯誤值。WrapAWrapB

  • 然后,您可以使用錯誤。在無標記內(nèi)檢查函數(shù)返回的更高級別錯誤的原因。switchdoStuff

(操場)

package main


import (

    "errors"

    "fmt"

)


var (

    a = errors.New("a")

    b = errors.New("b")

)


func doStuff() error {

    err := a

    if err != nil {

        return fmt.Errorf("%w", err)

    }

    err = b

    if err != nil {

        return fmt.Errorf("%w", err)

    }

    return nil

}


func main() {

    fmt.Println("Hello, playground")

    switch err := doStuff(); {

    case errors.Is(err, a):

        fmt.Println("error from doing a")

    case errors.Is(err, b):

        fmt.Println("error from doing b")

    case err == nil:

        fmt.Println("nil")

    default:

        fmt.Println("unknown")

    }

}


查看完整回答
反對 回復 2022-09-26
?
jeck貓

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

添加一個結(jié)構化的錯誤版本,該版本沿著各種更具體的錯誤類型組成一個類型;Wrap


package main


import (

    "errors"

    "fmt"

)


func a() error {

    return errors.New("something more specific broke in a")

}


func b() error {

    return errors.New("something more specific broke in b")

}


func doStuff() error {

    err := a()

    if err != nil {

        return ErrA{

            Wrap:        Wrap{err: err},

            SpecficProp: "whatever",

        }

    }

    err = b()

    if err != nil {

        return ErrB{

            Wrap:         Wrap{err: err},

            SpecficProp2: "whatever else",

        }

    }

    return nil

}


func main() {

    fmt.Println("Hello, playground")

    err := doStuff()


    if target := (ErrA{}); errors.As(err, &target) {

        fmt.Printf("%v\n", target)

    } else if target := (ErrB{}); errors.As(err, &target) {

        fmt.Printf("%v\n", target)

    } else if err != nil {

        fmt.Println("unknown")

    } else {

        fmt.Println("nil")

    }

}


type Wrap struct {

    err error

}


func (e Wrap) Error() string {

    return e.err.Error()

}


func (e Wrap) Unwrap() error {

    return e.err

}


type ErrA struct {

    Wrap

    SpecficProp interface{}

}


func (e ErrA) Error() string {

    return fmt.Sprintf("got error of kind A with %#v, plus %T", e.SpecficProp, e.Unwrap())

}


type ErrB struct {

    Wrap

    SpecficProp2 interface{}

}


func (e ErrB) Error() string {

    return fmt.Sprintf("got error of kind B with %#v, plus %T", e.SpecficProp2, e.Unwrap())

}


查看完整回答
反對 回復 2022-09-26
?
忽然笑

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

如果可以的話,使用常量錯誤。然后,您可以打開錯誤本身。


查看完整回答
反對 回復 2022-09-26
  • 3 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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