【问题标题】:How to catch panic when HTTP client make request to unavailable url?当 HTTP 客户端向不可用的 url 发出请求时如何捕捉恐慌?
【发布时间】: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


【解决方案1】:

问题是:

log.Fatal(err)

这个函数执行两件事。首先,它记录。但是这个函数也退出了。

// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
    std.Output(2, fmt.Sprint(v...))
    os.Exit(1)
}

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 2020-09-02
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2020-11-10
    • 2021-03-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多