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

2016-05-09 13:47:16 +08:00
 Phant0m

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()
1919 次点击
所在节点    Go 编程语言
11 条回复
zhujinliang
2016-05-09 13:55:12 +08:00
不要 panic ,直接 return 就忽略掉了
WildCat
2016-05-09 13:55:34 +08:00
resp, _ = client.Do(...
Phant0m
2016-05-09 14:20:58 +08:00
@WildCat resp,_ client.Do(... 会报错
WildCat
2016-05-09 14:24:12 +08:00
:=
raincious
2016-05-09 14:30:52 +08:00
@WildCat

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

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

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

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

如果想要忽略的话,可以尝试返回一个空内容,这样至少不会出错,但是不推荐忽略任何错误。
Phant0m
2016-05-09 14:41:26 +08:00
@raincious 返回
```
panic: runtime error: invalid memory address or nil pointer dereference
```
raincious
2016-05-09 14:51:25 +08:00
@Phant0m

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

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

正确的方法是返回 nil 附带一个错误,比如 return nil, err ,然后调用层 if 这个返回的 err 再进行处理。
mengzhuo
2016-05-09 15:01:19 +08:00
不 panic 不就好了……
直接返回 err 和 数据 让上层接口决定怎么处理
Phant0m
2016-05-09 15:12:17 +08:00
@raincious 明白了 感谢
eastany
2016-05-09 15:57:11 +08:00
都 panic 了 Body 必然为 nil ,你再 defer 肯定出错了。
yougg
2016-05-09 22:34:28 +08:00
楼主建议你打死都不要在自己的代码里面写 panic, 这不是 Java.

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

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

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

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

© 2021 V2EX