解释Golang错误代码

时间:2016-08-24 10:06:11

标签: go error-handling

所以大多数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语句中进行某种正则表达式匹配或对错误字符串进行子切片,但这对于解决这个问题感觉非常糟糕。

有什么建议吗?必须有一种惯用的方法来捕捉这样的错误吗?

1 个答案:

答案 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}}