如何在Go中指定和处理特定错误?

时间:2015-01-03 20:05:21

标签: error-handling go

我写了这个非常基本的解析器,通过Reddit JSON,我很好奇如何在Go中专门管理错误。

例如我有这个" Get"链接方法:

func Get(reddit string) ([]Item, error) {
    url := fmt.Sprintf("http://reddit.com/r/%s.json", reddit)
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
        return nil, err
    }
    /*
     * Other code here
    */
}

如何处理来自StatusCode的404错误?我知道我可以测试404错误本身:

if resp.StatusCode == http.StatusNotfound {
    //do stuff here
}

但有没有办法可以直接管理resp.StatusCode != http.StatusOK而无需编写一堆if语句?有没有办法在switch语句中使用err

2 个答案:

答案 0 :(得分:1)

首先请注意,http.Get不会返回HTTP返回的错误,该错误不是200.即使服务器发出404错误,Get也能成功完成其工作。来自文档

  

非2xx响应不会导致错误。

在您的代码中,err在您致电时会nil,这意味着它会返回err=nil,这可能不是您想要的。

if resp.StatusCode != http.StatusOK {
    return nil, err
}

这应该做你想要的事情

if resp.StatusCode != http.StatusOK {
    return nil, fmt.Errorf("HTTP Error %d: %s", resp.StatusCode, resp.Status)
}

对于任何类型的HTTP错误,都会返回错误,并显示错误信息。

答案 1 :(得分:0)

当然可以:

package main

import "fmt"

func main() {
    var err error
    switch err {
    case nil:
        fmt.Println("Is nil")
    }
}

https://play.golang.org/p/4VdHW87wCr