所以大多数go错误处理的例子我看到只是将任何错误传递回堆栈。在某些时候,这些需要解释,这就是我想要做的。 这是我尝试的片段:
resp, err := http.Get(string(url))
defer out_count.Dec()
if err != nil {
switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case http.ErrMissingFile:
fmt.Println("Missing File")
{some more cases here}
case io.EOF:
fmt.Println("EOF error found")
default:
fmt.Printf("Error type is %T\n", err)
panic(err)
}
return
虽然我目前的情况不适用(编辑删除网址):
ERROR: Failed to crawl "http://{removed URL}"
Error type is *url.Error
panic: Get http://{removed url}: EOF
goroutine 658 [running]:
runtime.panic(0x201868, 0x106352c0)
/usr/lib/go/src/pkg/runtime/panic.c:279 +0x1a0
github.com/cbehopkins/grab/grab.crawl(0x10606210, 0x27, 0x105184b0, 0x105184e0, 0x10500460)
我无法找到一种方法来获取switch语句以捕获此错误,因为错误的文本每次都会更改,并且没有我可以捕获的显式值。 (因为URL一直在变化)。现在也许我可以在case语句中进行某种正则表达式匹配或对错误字符串进行子切片,但这对于解决这个问题感觉非常糟糕。
有什么建议吗?必须有一种惯用的方法来捕捉这样的错误吗?
答案 0 :(得分:4)
最简单的方法是在代码中包含程序包级错误值:
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)
}
}
中:
{{1}}