golang http 请求也太恶心了把

2021-05-08 21:06:42 +08:00
 chenqh

使用 http 包碰到的 error

我是不是写的代码有问题呀, 为什么要处理这么多?

7189 次点击
所在节点    Go 编程语言
23 条回复
ch2
2021-05-08 21:13:39 +08:00
connection reset by peer 是 tcp 连接断开,这网络编程中是必须处理的
Jirajine
2021-05-08 21:15:49 +08:00
简单应用请求个 API 之类的你不用管那么多的,出错就抛就完事了。
chenqh
2021-05-08 21:19:57 +08:00
@Jirajine 关键我在加重试功能,你懂的,就是一个请求,重复请求几次,知道成功

@ch2 关键 golang ioutil.ReadAll(resp.Body) 也会触发 `connection reset by peer`, `(Client.Timeout or context cancellation while reading body)`, `EOF` 感觉要重复处理,关键封装 RepeatRequest 完全封装不了
chenqh
2021-05-08 21:21:24 +08:00
还有

* 创建 http: server closed idle connection

* 读 body http: server closed idle connection
rekulas
2021-05-08 21:23:00 +08:00
跟 go 没关 网络 /传输规范定的
这也就算中层,已经算好用了,你要是去做更底层对接才吐血
billlee
2021-05-08 21:26:15 +08:00
需要方便使用的一个封装库吧,就像 Java 写 HTTP 也没有人会直接用标准库的 HttpUrlConnection
gBurnX
2021-05-08 22:10:48 +08:00
你的 C 语言老师,应该不太负责。

一款程序,要稳定,需要讲究鲁棒性。鲁棒性的提高,需要通过处理很多很多问题来实现的,是很麻烦。

举个大家都懂的例子:

写文件。也就是程序向本地存储写文件。

你能想到哪些会导致不稳定或失败的场景?

我先不说答案,你自己可以先考虑一下。只有你考虑到的场景越多,你的程序都对这些场景做了处理,你的程序才会更健壮,更稳定。
Jirajine
2021-05-08 22:40:45 +08:00
@chenqh 重试也可以不用管具体错误是什么,数据小就直接 ReadAll 读完,数据大需要流式读只需要处理下 EOF,别的都不用管。
chenqh
2021-05-08 22:42:42 +08:00
@Jirajine 我就是 readAll
Jirajine
2021-05-08 22:48:07 +08:00
@chenqh 那就什么都不用管,直接顺着调用,出错就抛。上层调用遇到错误计数加一然后重试,超过 n 次再抛。
janxin
2021-05-08 22:50:38 +08:00
这个跟封装没关系吧,本质上是各种类型错误处理的问题。提到需要区分每种错误然后处理的话这样子是没法避免的就是这么多,因为每个错误出现都是一种可能性;当然你想合并处理也并无不可,通过判断错误类型之类的就可以,但是创建和读 body 的错误合并没问题吗?如果这种前提下更多的错误可以合并处理吧?
chenqh
2021-05-08 22:53:49 +08:00
@janxin 怎么合并呀,感觉合并了,如果是 exception 那种我知道合并, golang 这个 error 我不会合并
Vedar
2021-05-08 23:25:15 +08:00
不用处理这么多 直接 panic recover 里面处理 就好了呀 和 exception 一样的呀
wangsongyan
2021-05-08 23:25:44 +08:00
感觉你代码有问题,贴出来看看?
lujjjh
2021-05-09 00:42:56 +08:00
https://blog.golang.org/error-handling-and-go

其实你要判断的是 err 是不是 Temporary 的,如果是,就是 retryable 的。
neoblackcap
2021-05-09 09:55:59 +08:00
这些也是非常常见的网络错误,这换其他的语言也要处理的
chenqh
2021-05-09 11:15:08 +08:00
@neoblackcap 关键是 golang, 读 body 也要重复处理一次,想 py,的 requests, res.text 直接读了,可能是我还不习惯 golang 的 error 处理把,如果是 python 那种 exceptions,我知道怎么到,golang 的 error 就感觉不会做了
matrix67
2021-05-09 11:36:08 +08:00
sagaxu
2021-05-09 11:36:25 +08:00
panic recover 就是 try catch 换个皮
joesonw
2021-05-09 14:15:20 +08:00
别听人忽悠用 panic. panic 很重的, 会带上整个调用栈信息, 除非是 critical 需要中断业务处理才 panic, 用 error 虽然麻烦点, 但是更明确, 轻量.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX