4 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
由于您的Error類型實現(xiàn)了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條經(jīng)驗 獲得超6個贊
輸入錯誤
error 內(nèi)置接口類型是表示錯誤條件的常規(guī)接口,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條經(jīng)驗 獲得超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條經(jīng)驗 獲得超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")
產(chǎn)生預(yù)期的結(jié)果。
- 4 回答
- 0 關(guān)注
- 263 瀏覽
添加回答
舉報