Fli*_*mzy 13
DetailedErrorerror
func foo(answer, x, y int) (int, error) {
if answer == 42 {
return 100, nil //!! cannot use nil as type DetailedError in return argument
}
return 0, DetailedError{x: x, y: y}
}
DetailedErrorerror
value, err := foo(...)
if err != nil {
if detailedErr, ok := err.(DetailedError); ok {
// Do something with the detailed error values
} else {
// It's some other error type, behave accordingly
}
}
DetailedError
它现在似乎不重要,但将来您的代码可能会扩展以包含其他错误检查:
func foo(answer, x, y int) (int, error) {
cache, err := fetchFromCache(answer, x, y)
if err != nil {
return 0, fmt.Errorf("Failed to read cache: %s", err)
}
// ...
}
DetailedErrorerror
DetailedError
func fooWrapper(answer, x, y int) (int, error) {
// Do something before calling foo
result, err := foo(answer, x, y)
if err != nil {
return 0, err
}
// Do something after calling foo
return result, nil
}
error
利用这一点,不要绕过它.
即使您的代码永远不会更改,为每个函数或用例创建新的自定义错误类型也是不可持续的,并且使您的代码无法读取且无法推理.