2 回答

TA貢獻1829條經(jīng)驗 獲得超7個贊
的實現(xiàn)者Computer應該用域錯誤來響應,因為它們是最接近操作的錯誤并且最能確定錯誤是什么。就像你說的,擁有這種邏輯打破 ComputeService了抽象。如果您需要將代碼從特定Computer錯誤映射到域錯誤,請創(chuàng)建將主要邏輯與該錯誤包裝代碼分開的包裝器結(jié)構(gòu)。
要保留內(nèi)部錯誤上下文,只需將原始錯誤嵌入到域錯誤中并創(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貢獻1811條經(jīng)驗 獲得超4個贊
要保留內(nèi)部錯誤上下文,只需將原始錯誤嵌入到域錯誤中
我想我們都同意這
strings.Contains(err.Error(), "not found")
是脆弱的代碼。我希望我們也同意我們更愿意看到像
errors.Is(err, os.ErrNotExist)
.但要點是,在許多情況下,包的未來發(fā)展必須避免調(diào)用者依賴特定的錯誤結(jié)果來滿足
errors.Is(err, os.ErrNotExist)
,即使這是導致今天結(jié)果的根本原因。
這就像查看未導出的字段或比較錯誤文本 - 這是一個可能會改變的細節(jié)。雖然
strings.Contains
看起來很脆弱,但errors.Is
看起來并不脆弱,也不應被視為脆弱。
如果我們要避免它變得脆弱,那么我們需要為包提供一種方法來報告詳細信息,而無需讓客戶對其進行測試。這種方式是無法解包的錯誤。
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 的當前狀態(tài):
只是說明我認為團隊提供的折衷解決方案:
fmt.Errorf
目前被廣泛用于包裝錯誤并返回一個新的(不透明的)錯誤(因為您無法訪問底層錯誤)。
'?%w
' 現(xiàn)在可用于顯式選擇返回可解包的錯誤。errors 被設計為沒有依賴關系的基礎包,因此每個包都可以依賴它。
團隊同意在存在廣泛分歧的領域下注,并希望發(fā)布足夠多的內(nèi)容(errors.Is,errors.As,對大多數(shù)人包裝錯誤的方式的擴展),以便人們可以實現(xiàn)目標。
泛型還沒有出現(xiàn),我們不知道它什么時候會出現(xiàn):關于泛型的激烈討論將使這個關于“錯誤 2 值”的問題看起來像兒戲。
errors.Is
并且errors.As
干凈簡潔,足以長時間舒適。
大多數(shù)有爭議的事情都被推遲到 1.14。
Wrapf
不能存在錯誤,因為它是一個基礎包。Wrapf
意味著團隊必須決定在nil
傳遞錯誤時會發(fā)生什么:下注。Wrap 可能會與正在考慮的本地化、國際化等想法發(fā)生沖突。
ErrorFormatter
并且ErrorPrinter
還沒有得到更深入的使用并且有疣。平底船。
- 2 回答
- 0 關注
- 116 瀏覽
添加回答
舉報