Golang Go语言中 Http client 进行 POST 请求时,如何忽略由于网络异常引起的异常
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
不要 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请求时,忽略由于网络异常引起的异常,通常涉及错误处理和重试机制。以下是一些建议,帮助你实现这一点:
-
错误检查与分类: 在进行POST请求后,检查返回的error对象。使用类型断言或类型开关(type switch)来判断错误是否由网络异常引起。
net.OpError
和url.Error
中的Timeout
和Temporary
字段可以帮助你识别这类错误。 -
重试机制: 实现一个简单的重试逻辑,当检测到网络异常时,延迟一段时间后重试请求。可以使用
time.Sleep
和循环来实现这一机制。注意设置合理的重试次数和延迟时间,避免无限重试或请求风暴。 -
日志记录: 对于被忽略的网络异常,建议记录日志,以便后续分析和调试。使用Go的
log
包或更高级的日志库(如logrus
、zap
)来记录错误信息。 -
配置Http client: 设置Http client的Timeout,避免请求长时间挂起。同时,可以配置Transport层的参数,如
MaxIdleConns
、IdleConnTimeout
等,优化网络连接管理。 -
使用第三方库: 考虑使用如
github.com/hashicorp/go-retryablehttp
这样的第三方库,它提供了内置的重试逻辑和错误处理,可以简化你的代码。
通过上述方法,你可以有效地忽略并处理由于网络异常引起的异常,提高程序的健壮性和用户体验。