3 回答

TA貢獻1811條經(jīng)驗 獲得超6個贊
如果我正確地理解了這個問題,你確實可以簡化事情:
定義 和 作為包級變量,以便于使用和提高性能。
a
b
error
除非需要以編程方式訪問只能在要包裝的錯誤上下文中訪問的值,否則很可能不需要聲明這些自定義類型和錯誤類型。相反,您可以簡單地將
%w
謂詞與fmt 結(jié)合使用。Errorf
以生成包裝較低級別錯誤的新錯誤值。WrapA
WrapB
然后,您可以使用
錯誤。在
無標記內(nèi)檢查函數(shù)返回的更高級別錯誤的原因。switch
doStuff
(操場)
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")
}
}

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())
}
- 3 回答
- 0 關注
- 196 瀏覽
添加回答
舉報