【发布时间】:2018-01-13 15:56:31
【问题描述】:
我需要向某些 URL 发出请求。有可能,其中有人不可用。对我来说没问题,我只想忽略这些 URL。
我的问题是我无法捕获发生的错误。我收到一条错误消息:
2018/01/13 18:46:24 Get http://fakesite.com: dial tcp [::1]:8084: connectex: No connection could be made because the target machine actively refused it.
我的示例代码是:
package main
import (
"fmt"
"log"
"net/http"
"io/ioutil"
)
func main() {
c := make(chan string, 1)
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("try to catch error1", r)
}
}()
resp, err := http.Get("http://fakesite.com")
if err != nil {
log.Fatal(err)
c <- ""
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
c <- ""
return
}
c <- string(body)
}()
defer func() {
if r := recover(); r != nil {
fmt.Println("try to catch error2", r)
}
}()
msg := <-c
fmt.Println(msg)
}
【问题讨论】:
-
如果您想捕获错误,为什么要使用 fatal 记录?只需将
log.Fatal(err)替换为您想要执行的任何错误处理即可。还是我错过了什么?如果您可以忽略它,只需使用log.Print记录错误并继续。 -
@Marc OMG,我刚刚打开
log.Fatal(err)并意识到这不仅仅是关于日志记录,而是os.Exit(1)。谢谢。 -
请注意
Fatal不是恐慌,因此无法恢复。它应该只用于不可恢复的错误。其他一切都应该panic或返回错误。 -
@Marc,我知道了,谢谢
标签: go exception httpclient panic