1 回答

TA貢獻1790條經(jīng)驗 獲得超9個贊
Is您可以通過創(chuàng)建實現(xiàn)和方法的錯誤類型來實現(xiàn)所需的行為,Unwrap如下所示:
package lib
import (
"fmt"
"strconv"
)
type FoobarError struct {
msg string
original error
}
func (err *FoobarError) Error() string {
return fmt.Sprintf("%s: %s", err.msg, err.original.Error())
}
func (err *FoobarError) Unwrap() error {
return err.original
}
func (err *FoobarError) Is(target error) bool {
_, ok := target.(*FoobarError)
return ok
}
func SomeFunc() error {
// strconv.ErrSyntax is used as a dummy error here for the error
// that might be returned by strconv.Atoi or any other operation.
err := strconv.ErrSyntax
return &FoobarError{"foobar", err}
}
用法:
package main
import (
"errors"
"fmt"
"strconv"
"lib"
)
func main() {
if err := lib.SomeFunc(); err != nil {
fmt.Println(err) // foobar: invalid syntax
fmt.Println(errors.Is(err, &lib.FoobarError{})) // true
fmt.Println(errors.Is(err, strconv.ErrSyntax)) // true
}
}
您可以在此處閱讀有關(guān)此方法的更多信息。
獎金
與 Go 的os.IsExist類似,您可能有興趣在庫中添加一個幫助函數(shù),以便用戶更輕松地檢查錯誤:
package lib
import (
"errors"
// ...
)
// ...
func IsFoobar(err error) bool {
return errors.Is(err, &FoobarError{})
}
用法:
package main
// ...
func main() {
err := lib.SomeFunc();
if lib.IsFoobar(err) {
// ...
}
}
- 1 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報