2 回答

TA貢獻(xiàn)1757條經(jīng)驗 獲得超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")
如果您想通過錯誤傳遞更多信息,您可以創(chuàng)建自己的自定義錯誤:
type MyError struct {
URL string
}
func (e MyError) Error() string {
return fmt.Sprintf("Error getting: %v", e.URL)
}
然后,您可以在需要時創(chuàng)建此錯誤。例如:
url := "http://www.google.com"
res, err := http.Get(url)
if err != nil {
return MyError{url}
}
最后,在您的錯誤檢查方法中,您可以使用類型開關(guān)而不是簡單開關(guān)來獲取錯誤:
switch err.(type) {
case MyError:
fmt.Println("Error:", err)
default:
fmt.Println("No Error")
}
在您的情況下,由于您混合了常規(guī)錯誤,因此可以將此檢查包含在嵌套中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貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊
您可以實現(xiàn)錯誤接口并創(chuàng)建自己的錯誤,您可能會發(fā)現(xiàn)這些錯誤更容易處理。
對于運(yùn)行時錯誤又名恐慌。您可以通過在您認(rèn)為可能會出現(xiàn)恐慌的函數(shù)中包含 recover() 來恢復(fù)。它在恐慌函數(shù)返回之前被調(diào)用。
defer func() {
if r := recover(); r != nil {
if _, ok := r.(runtime.Error); ok {
err = r.(error) //panic(r)
}
err = r.(error)
}
}()
}
- 2 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報