解释Golang错误代码
因此,大多数go错误处理的示例只是将任何错误都传递回堆栈。在某些时候,这些需要解释,而这正是我想要做的。 这是我尝试的一个片段:解释Golang错误代码
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
这不是工作,虽然我目前的情况下(编辑删除URL}:
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语句中做某种正则表达式匹配,或者对错误字符串进行分片,但是感觉这是一种解决此问题的非常糟糕的方式。
有什么建议吗?必须有一种惯用的方式来肯定地发现这样的错误?
最简单的方法是在你的代码包级别的错误值:
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)
}
}
您可以实现错误界面并创建您自己可能更容易处理的错误。
对于运行时错误a.k.a恐慌。你可以通过在你认为可能恐慌的函数中包含recover()来恢复。它在panicing函数返回之前调用。
defer func() {
if r := recover(); r != nil {
if _, ok := r.(runtime.Error); ok {
err = r.(error) //panic(r)
}
err = r.(error)
}
}()
}
啊,我觉得你有误解,恐慌是有我停止代码时,有我的代码无法处理错误。它给我提供了一个调试,说我没有抓住所有我应该遇到的问题。 尽管感谢 –
也许你不明白“实现错误界面”的含义是因为这就是你选择的答案。 – Sridhar
感谢您的详尽答案! 我认为这个问题是我得到frm标准html包的错误没有提供我可以匹配的这些错误定义。 但是你是正确的,我可以先对错误类型进行切换,然后再对错误细节进行切换。 对于这个应用程序来说,这就足够了,现在我只需要弄清楚如何将这个请求反馈回标准的html包。 谢谢 –