V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Phant0m
V2EX  ›  Go 编程语言

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

  •  
  •   Phant0m · 2016-05-09 13:47:16 +08:00 · 2004 次点击
    这是一个创建于 3115 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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()
    
    11 条回复    2016-05-09 22:34:28 +08:00
    zhujinliang
        1
    zhujinliang  
       2016-05-09 13:55:12 +08:00 via iPhone
    不要 panic ,直接 return 就忽略掉了
    WildCat
        2
    WildCat  
       2016-05-09 13:55:34 +08:00 via iPhone
    resp, _ = client.Do(...
    Phant0m
        3
    Phant0m  
    OP
       2016-05-09 14:20:58 +08:00
    @WildCat resp,_ client.Do(... 会报错
    WildCat
        4
    WildCat  
       2016-05-09 14:24:12 +08:00 via iPhone
    :=
    raincious
        5
    raincious  
       2016-05-09 14:30:52 +08:00   ❤️ 1
    @WildCat

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

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

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

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

    如果想要忽略的话,可以尝试返回一个空内容,这样至少不会出错,但是不推荐忽略任何错误。
    Phant0m
        6
    Phant0m  
    OP
       2016-05-09 14:41:26 +08:00
    @raincious 返回
    ```
    panic: runtime error: invalid memory address or nil pointer dereference
    ```
    raincious
        7
    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
        8
    mengzhuo  
       2016-05-09 15:01:19 +08:00 via iPhone
    不 panic 不就好了……
    直接返回 err 和 数据 让上层接口决定怎么处理
    Phant0m
        9
    Phant0m  
    OP
       2016-05-09 15:12:17 +08:00
    @raincious 明白了 感谢
    eastany
        10
    eastany  
       2016-05-09 15:57:11 +08:00
    都 panic 了 Body 必然为 nil ,你再 defer 肯定出错了。
    yougg
        11
    yougg  
       2016-05-09 22:34:28 +08:00
    楼主建议你打死都不要在自己的代码里面写 panic, 这不是 Java.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3651 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.