2 回答
TA贡献1757条经验 获得超7个赞
最简单的方法是在代码中包含包级别的错误值:
var URLFetchError = errors.New("Cannot fetch URL")
url := "http://www.google.com"
res, err := http.Get(url)
if err != nil {
return URLFetchError
}
然后switch变成:
switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case URLFetchError:
fmt.Println("Error fetching URL")
如果您想通过错误传递更多信息,您可以创建自己的自定义错误:
type MyError struct {
URL string
}
func (e MyError) Error() string {
return fmt.Sprintf("Error getting: %v", e.URL)
}
然后,您可以在需要时创建此错误。例如:
url := "http://www.google.com"
res, err := http.Get(url)
if err != nil {
return MyError{url}
}
最后,在您的错误检查方法中,您可以使用类型开关而不是简单开关来获取错误:
switch err.(type) {
case MyError:
fmt.Println("Error:", err)
default:
fmt.Println("No Error")
}
在您的情况下,由于您混合了常规错误,因此可以将此检查包含在嵌套中switch:
switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case http.ErrMissingFile:
fmt.Println("Missing File")
case io.EOF:
fmt.Println("EOF error found")
default: // check for custom errors
switch err.(type) {
case MyError:
fmt.Println("custom error:", err)
default:
panic(err)
}
}
TA贡献1851条经验 获得超4个赞
您可以实现错误接口并创建自己的错误,您可能会发现这些错误更容易处理。
对于运行时错误又名恐慌。您可以通过在您认为可能会出现恐慌的函数中包含 recover() 来恢复。它在恐慌函数返回之前被调用。
defer func() {
if r := recover(); r != nil {
if _, ok := r.(runtime.Error); ok {
err = r.(error) //panic(r)
}
err = r.(error)
}
}()
}
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报