4 回答
TA贡献1827条经验 获得超7个赞
由于您的Error类型实现了error接口,因此最简单的解决方案是返回一个errorin Wrap():
func Wrap(err error, str string) error {
if err == nil {
return nil
}
e := &Error{
ErrString: str + err.Error(),
}
return e
}
TA贡献1824条经验 获得超6个赞
输入错误
error 内置接口类型是表示错误条件的常规接口,nil 值表示没有错误。
type error interface { Error() string }
类型err
的值不是零。它是类型的值。事实上,是interface
error
nil
*main.Error
err != nil && err.(*Error) == nil
true
例如,
package main
import (
"fmt"
)
func error1() {
err := foo()
fmt.Printf("%T %v %v %v\n", err, err, err == nil, err.(*Error) == nil)
if err != nil {
fmt.Printf("Found error %v\n", err)
return
}
fmt.Println("No Errors")
}
func error2() {
err := foo()
fmt.Printf("%T %v %v %v\n", err, err, err == nil, err.(*Error) == nil)
if err != nil && err.(*Error) != nil {
fmt.Printf("Found error %v\n", err)
return
}
fmt.Println("No Errors")
}
type Error struct {
ErrString string
}
func (e *Error) Error() string {
return e.ErrString
}
func Wrap(err error, str string) *Error {
if err == nil {
return nil
}
e := &Error{
ErrString: str + err.Error(),
}
return e
}
func foo() error {
err := bar()
return Wrap(err, "bar called")
}
func bar() error {
return nil
}
func main() {
error1()
fmt.Println()
error2()
}
游乐场:https://play.golang.org/p/nwNRa2sNwj0
输出:
*main.Error <nil> false true
Found error <nil>
*main.Error <nil> false true
No Errors
TA贡献1831条经验 获得超9个赞
将 foo() 返回值更改为 *Error
func foo() error {
err := bar()
return Wrap(err, "bar called")
}
或者:
func Wrap(err error, str string) error{
if err == nil {
return nil
}
e := &Error{
ErrString: str + err.Error(),
}
return e
}
TA贡献1712条经验 获得超3个赞
if err != nil
正在将 err 变量与 nil 进行比较error,但它实际上是 nil*Error
将代码更改为
err:=foo()
var nilerror *Error = nil
if err != nilerror {
fmt.Printf("Found error %v\n",err)
return
}
fmt.Println("No Errors")
产生预期的结果。
- 4 回答
- 0 关注
- 176 浏览
添加回答
举报