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")
}
}
我写了这个非常基本的解析器,通过 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")
}
}