Golang Go语言中 Http client 进行 POST 请求时,如何忽略由于网络异常引起的异常

发布于 1周前 作者 h691938207 来自 Go语言

Go Http client 进行 POST 请求时,由于网络异常引起的异常

body := bytes.NewBuffer([]byte(data))
req, err:= http.NewRequest("POST", url, body)
client := &http.Client{}
resp, err:= client.Do(req)
if err != nil {
    panic(err) //异常在这里
}
defer resp.Body.Close()

Golang Go语言中 Http client 进行 POST 请求时,如何忽略由于网络异常引起的异常

更多关于Golang Go语言中 Http client 进行 POST 请求时,如何忽略由于网络异常引起的异常的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

不要 panic ,直接 return 就忽略掉了

更多关于Golang Go语言中 Http client 进行 POST 请求时,如何忽略由于网络异常引起的异常的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


resp,_ client.Do(… 会报错



Golang 里千万不要忽略错误,尤其这种很可能发生的。

而且这个跟:=或者=没啥关系。

楼主正常返回是什么样的?

如果我来写这个的话,应该会 return err ,然后让调用层来处理对应的错误。
https://github.com/raincious/trailk/blob/master/source/src/trailk/appengine/urlfetch/wrapper.go#L63

如果想要忽略的话,可以尝试返回一个空内容,这样至少不会出错,但是不推荐忽略任何错误。

返回
<br>panic: runtime error: invalid memory address or nil pointer dereference<br>



可能是我说的不准确,空内容不是返回 nil ,而是返回比如空字符串之类。

比如你的代码里,可以建立一个空的(无作用的) Response ( https://golang.org/pkg/net/http/#Response ),然后进行返回(比如 return http.Response{})。但是当然这是不建议的。

正确的方法是返回 nil 附带一个错误,比如 return nil, err ,然后调用层 if 这个返回的 err 再进行处理。

不 panic 不就好了……
直接返回 err 和 数据 让上层接口决定怎么处理

明白了 感谢

都 panic 了 Body 必然为 nil ,你再 defer 肯定出错了。

楼主建议你打死都不要在自己的代码里面写 panic, 这不是 Java.

在Go语言中,使用Http client进行POST请求时,忽略由于网络异常引起的异常,通常涉及错误处理和重试机制。以下是一些建议,帮助你实现这一点:

  1. 错误检查与分类: 在进行POST请求后,检查返回的error对象。使用类型断言或类型开关(type switch)来判断错误是否由网络异常引起。net.OpErrorurl.Error中的TimeoutTemporary字段可以帮助你识别这类错误。

  2. 重试机制: 实现一个简单的重试逻辑,当检测到网络异常时,延迟一段时间后重试请求。可以使用time.Sleep和循环来实现这一机制。注意设置合理的重试次数和延迟时间,避免无限重试或请求风暴。

  3. 日志记录: 对于被忽略的网络异常,建议记录日志,以便后续分析和调试。使用Go的log包或更高级的日志库(如logruszap)来记录错误信息。

  4. 配置Http client: 设置Http client的Timeout,避免请求长时间挂起。同时,可以配置Transport层的参数,如MaxIdleConnsIdleConnTimeout等,优化网络连接管理。

  5. 使用第三方库: 考虑使用如github.com/hashicorp/go-retryablehttp这样的第三方库,它提供了内置的重试逻辑和错误处理,可以简化你的代码。

通过上述方法,你可以有效地忽略并处理由于网络异常引起的异常,提高程序的健壮性和用户体验。

回到顶部