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
}

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)有得到更深入的使用并且有疣。平底船。
- 2 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)