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

How to specify and handle specific errors in 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 吗?

首先请注意 http.Get 不会 return HTTP return 不是 200 的错误。即使服务器给它一个 Get 也成功完成了它的工作404 错误。来自文档

A non-2xx response doesn't cause an error.

因此在您的代码中,当您调用它时,err 将是 nil,这意味着它将 return 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)
}

这将 return 任何类型的 HTTP 错误的错误,并附有关于它是什么的消息。

当然可以:

package main

import "fmt"

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

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