解读 Golang 错误代码

因此,我看到的大多数 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

这对我目前的情况不起作用(编辑删除 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 语句中进行某种正则表达式匹配或对错误字符串进行子切片,但这感觉是解决此问题的一种非常糟糕的方法。


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


拉风的咖菲猫
浏览 176回答 2
2回答

长风秋雁

最简单的方法是在代码中包含包级别的错误值: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)    }}

繁花不似锦

您可以实现错误接口并创建自己的错误,您可能会发现这些错误更容易处理。对于运行时错误又名恐慌。您可以通过在您认为可能会出现恐慌的函数中包含 recover() 来恢复。它在恐慌函数返回之前被调用。defer func() {    if r := recover(); r != nil {        if _, ok := r.(runtime.Error); ok {                err = r.(error) //panic(r)            }            err = r.(error)        }    }()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go