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

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

如何將 golang 錯誤包裝成不透明錯誤?

如何將 golang 錯誤包裝成不透明錯誤?

Go
慕勒3428872 2022-10-17 19:43:11
如何將錯誤包裝成不透明的錯誤(如 Dave Cheney 在https://dave.cheney.net/2016/04/27/dont-just-check-errors-handle-them-gracefully中所述)?另外,我希望不透明錯誤有一個堆棧跟蹤,并通過返回鏈保留它。errors.Wrap()使用堆棧跟蹤創(chuàng)建一個新錯誤,但不是我的不透明類型。我該怎么做(添加堆棧跟蹤并使其成為MyErr臨時 as true)?package mainimport (    "fmt"    "github.com/pkg/errors")type temporary interface {    Temporary() bool}func IsTemporary(err error) bool {    te, ok := err.(temporary)    return ok && te.Temporary()}type MyError struct {    error    isTemporary bool}func (e MyError) Temporary() bool {    return e.isTemporary}func f1() error {   // imitate a function from another package, that produces an error    return fmt.Errorf("f1 error")}func f2() error {    err := f1()    myErr := errors.Wrap(err, "f2 error")   // Wrap() adds the stacktrace    // how to wrap it as a temporary MyErr?    return myErr}func f3() error {    err := f2()    return fmt.Errorf("f3 error: %+v", err) // don't Wrap() here or we get another stacktrace}func f4() error {    err := f3()    return fmt.Errorf("f4 error: %+v", err) // the '+' isn't needed here but does no harm}func main() {    err := f4()    if err != nil {        if IsTemporary(err) {            fmt.Println("temporary error")        }        fmt.Printf("oops: %+v\n", err)    }}這是正確的,只是我想先看到“臨時錯誤”。假設f1實際上在第 3 方或內(nèi)置代碼中,返回標準error類型。 f2是我的代碼中收到該錯誤的第一個函數(shù),需要在適當?shù)臅r候將其設為臨時函數(shù)。(如果最初是臨時的,那將是一個后續(xù)問題,但我想我可以弄清楚。)我希望處理從我們的代碼返回的錯誤的模式在整個項目中保持一致,這將是相對較大的。
查看完整描述

1 回答

?
慕哥6287543

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

你不能用這個github.com/pkg/errors函數(shù)真正做到這一點。這是因為用于包裝的錯誤類型未導出,因此您無法將其嵌入到您自己的自定義錯誤中。


但是,鑒于您不反對使用 stdliberrors包以外的錯誤庫,以下是使用juju 錯誤包的方法(因為它的 Err 類型已導出):


package main


import (

    "fmt"


    "github.com/juju/errors"

)


type temporary interface {

    Temporary() bool

}


func IsTemporary(err error) bool {

    for {

        te, ok := err.(temporary)

        if ok {

            return te.Temporary()

        }


        er, ok := err.(*errors.Err)

        if ok {

            err = er.Underlying()

            continue

        }


        return false

    }

}


type MyError struct {

    errors.Err

    isTemporary bool

}


func (e MyError) Temporary() bool {

    return e.isTemporary

}


func f1() error { // imitate a function from another package, that produces an error

    return errors.Errorf("f1 error")

}


func f2() error {

    err := f1()

    wrappedErr := errors.Annotate(err, "f2 error")

    return &MyError{

        Err:         *wrappedErr.(*errors.Err),

        isTemporary: true,

    }

}


func f3() error {

    err := f2()

    return errors.Annotate(err, "f3 error")

}


func f4() error {

    err := f3()

    return errors.Annotate(err, "f4 error")

}


func main() {

    err := f4()

    if err != nil {

        if IsTemporary(err) {

            fmt.Println("temporary error")

        }

        if e, ok := err.(*errors.Err); ok {

            fmt.Printf("oops: %+v\n", e.StackTrace())

        }

    }

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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