2 回答

TA貢獻1921條經驗 獲得超9個贊
https://golang.org/pkg/net/#Error是一個接口,并且定義Timeout并且Temporary將是微不足道的,因為它們只是返回bool。
package main
import(
"fmt"
"net"
)
type mockNetError struct {
temporary bool
timeout bool
}
func (e *mockNetError)Error() string {
return fmt.Sprintf("mockNetworkError: timeout %b, temporary %b", e.timeout, e.temporary)
}
func (e *mockNetError)Temporary() bool{
return e.temporary
}
func (e *mockNetError)Timeout() bool{
return e.timeout
}
func main() {
var err error = new(mockNetError)
if nerr, ok := err.(net.Error); ok {
fmt.Println("It was a network error! %s", nerr.Error())
}
}
但是,因為net.Error是接口類型,err.(type)所以永遠不會返回它。在我的代碼中,我斷言它可能滿足該接口,這與詢問它是否是err接口中值的類型不同。
您提到的其他錯誤net不是接口(盡管它們確實滿足net.Error)。
https://blog.golang.org/go1.13-errors討論了錯誤包裝在 go 中的工作原理。
約定而不是更改:包含另一個錯誤的錯誤可能會實現返回底層錯誤的 Unwrap 方法。
原因%w幾乎總是這樣做的,因為人們幾乎總是在錯誤中添加額外的文本。
實際上,是一個可以通過提供方法net.OsError包裝另一個錯誤的示例。Unwrap()
如果您想創建這樣的錯誤,只需:
fmt.Println(net.OpError{
Op: "mock",
Net: "mock",
Source: &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 1234 },
Addr: &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12340 },
Err: fmt.Errorf("Mock net.OpError"),
})

TA貢獻1804條經驗 獲得超7個贊
基于 Daniel Farrell 的回答,我發現了一個模擬 os.SyscallError 的示例,該示例深埋在適用于 Golang 的 AWS 開發工具包中。把它們放在一起,我們得到這個:
return nil, &net.OpError{ Op: "mock", Net: "mock", Source: &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 1234}, Addr: &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12340}, Err: &os.SyscallError{Syscall: "read", Err: syscall.ECONNRESET}, }
- 2 回答
- 0 關注
- 121 瀏覽
添加回答
舉報