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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將外部錯(cuò)誤映射到 golang 中的域錯(cuò)誤

將外部錯(cuò)誤映射到 golang 中的域錯(cuò)誤

Go
Qyouu 2023-04-17 16:03:08
我有一個(gè)稱為ComputeService實(shí)現(xiàn)特定域邏輯的服務(wù)類型。服務(wù)本身取決于調(diào)用的接口的實(shí)現(xiàn),Computer該接口具有方法Computer.Compute(args...) (value, error)。如圖所示,Compute它本身可能會(huì)返回某些錯(cuò)誤。ComputeService需要使用正確的域錯(cuò)誤代碼從一組域錯(cuò)誤中發(fā)送適當(dāng)?shù)腻e(cuò)誤,以便可以完成翻譯,并且客戶端也可以適當(dāng)?shù)靥幚礤e(cuò)誤。我的問(wèn)題是,Computer實(shí)現(xiàn)應(yīng)該將它們的失敗包裝在域錯(cuò)誤中還是應(yīng)該ComputeService這樣做。如果ComputeService是這樣做的人,那么它將必須知道Computer接口的不同實(shí)現(xiàn)返回的不同錯(cuò)誤,在我看來(lái)這打破了抽象。兩種方式如下所示:package arithmetictype Computer struct {}func (ac Computer) Compute(args ....) (value, error) {     // errors is a domain-errors package defined in compute service project     return errors.NewDivideByZero()}或者package computetype Service struct {}func (svc Service) Process(args...) error {    computer := findComputerImplementation(args...)    val, err := computer.Compute(args...)    if err != nil {       if err == arith.ErrDivideByZero {          // converting an arithmetic computer implementation           // specific error to domain error          return errors.NewDivideByZero()       } else if err == algebra.ErrInvalidCoEfficient {          // converting an algebraic computer implementation           // specific error to domain error          return errors.NewBadInput()       }       // some new implementation was used and we have no idea       // what errors it could be returning. so we have to send       // a internal server error equivalent here       return errors.NewInternalError()    }}
查看完整描述

2 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

的實(shí)現(xiàn)者Computer應(yīng)該用域錯(cuò)誤來(lái)響應(yīng),因?yàn)樗鼈兪亲罱咏僮鞯腻e(cuò)誤并且最能確定錯(cuò)誤是什么。就像你說(shuō)的,擁有這種邏輯打破 ComputeService了抽象。如果您需要將代碼從特定Computer錯(cuò)誤映射到域錯(cuò)誤,請(qǐng)創(chuàng)建將主要邏輯與該錯(cuò)誤包裝代碼分開的包裝器結(jié)構(gòu)。


要保留內(nèi)部錯(cuò)誤上下文,只需將原始錯(cuò)誤嵌入到域錯(cuò)誤中并創(chuàng)建IsSpecificDomainError幫助程序。


type MyDomainError struct {

    Err error

}


func NewMyDomainErr(err error) error {

    return &MyDomainError{err}

}


func IsMyDomainError(e error) bool {

    _, ok := err.(*MyDomainError)

    return ok

}


查看完整回答
反對(duì) 回復(fù) 2023-04-17
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

要保留內(nèi)部錯(cuò)誤上下文,只需將原始錯(cuò)誤嵌入到域錯(cuò)誤中

我想我們都同意這strings.Contains(err.Error(), "not found")是脆弱的代碼。

我希望我們也同意我們更愿意看到像errors.Is(err, os.ErrNotExist).

但要點(diǎn)是,在許多情況下,包的未來(lái)發(fā)展必須避免調(diào)用者依賴特定的錯(cuò)誤結(jié)果來(lái)滿足errors.Is(err, os.ErrNotExist),即使這是導(dǎo)致今天結(jié)果的根本原因。
這就像查看未導(dǎo)出的字段或比較錯(cuò)誤文本 - 這是一個(gè)可能會(huì)改變的細(xì)節(jié)。

雖然strings.Contains看起來(lái)很脆弱,但errors.Is看起來(lái)并不脆弱,也不應(yīng)被視為脆弱。
如果我們要避免它變得脆弱,那么我們需要為包提供一種方法來(lái)報(bào)告詳細(xì)信息,而無(wú)需讓客戶對(duì)其進(jìn)行測(cè)試。這種方式是無(wú)法解包的錯(cuò)誤。

err.As():

var pe *os.PathError

if errors.As(err, &pe) {

? ? ?use(pe)

}

%在


func inner() error { return errors.New("inner error") }

func outer() error { return fmt.Errorf("outer error: %w", inner()) }


fmt.Fprintf("%+v", outer())

// outer error:

//? ? ?/path/to/file.go:123

//? ?- inner error:

//? ? ?/path/to/file.go:122

Go 1.13 的當(dāng)前狀態(tài):

只是說(shuō)明我認(rèn)為團(tuán)隊(duì)提供的折衷解決方案:

  • fmt.Errorf目前被廣泛用于包裝錯(cuò)誤并返回一個(gè)新的(不透明的)錯(cuò)誤(因?yàn)槟鸁o(wú)法訪問(wèn)底層錯(cuò)誤)。
    '?%w' 現(xiàn)在可用于顯式選擇返回可解包的錯(cuò)誤。

  • errors 被設(shè)計(jì)為沒(méi)有依賴關(guān)系的基礎(chǔ)包,因此每個(gè)包都可以依賴它。

  • 團(tuán)隊(duì)同意在存在廣泛分歧的領(lǐng)域下注,并希望發(fā)布足夠多的內(nèi)容(errors.Is,errors.As,對(duì)大多數(shù)人包裝錯(cuò)誤的方式的擴(kuò)展),以便人們可以實(shí)現(xiàn)目標(biāo)。

  • 泛型還沒(méi)有出現(xiàn),我們不知道它什么時(shí)候會(huì)出現(xiàn):關(guān)于泛型的激烈討論將使這個(gè)關(guān)于“錯(cuò)誤 2 值”的問(wèn)題看起來(lái)像兒戲。
    errors.Is并且errors.As干凈簡(jiǎn)潔,足以長(zhǎng)時(shí)間舒適。

大多數(shù)有爭(zhēng)議的事情都被推遲到 1.14。

  • Wrapf不能存在錯(cuò)誤,因?yàn)樗且粋€(gè)基礎(chǔ)包。

  • Wrapf意味著團(tuán)隊(duì)必須決定在nil傳遞錯(cuò)誤時(shí)會(huì)發(fā)生什么:下注。

  • Wrap 可能會(huì)與正在考慮的本地化、國(guó)際化等想法發(fā)生沖突。

  • ErrorFormatter并且ErrorPrinter還沒(méi)有得到更深入的使用并且有疣。平底船。


查看完整回答
反對(duì) 回復(fù) 2023-04-17
  • 2 回答
  • 0 關(guān)注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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