返回信息流我请求一个http接口,可能是返回异常,抛出panic,我要怎么处理这个啊 不想程序挂掉。
部分函数如下:
hReq, _ := http.NewRequest("GET", reqUrl, nil)
httpResp, err_d := Opi.httpClient.Do(hReq)
if err_d != nil {
Log.Error("Call local error! err:%v", err_d)
return "", err_d
}
if httpResp != nil {
defer httpResp.Body.Close()
}
if httpResp == nil {
Log.Error("Call local error! url:%v",reqUrl )
return "", err_d
}
defer func() {
if r:= recover(); r!= nil{
Log.Error("Call local error! url:%v",reqUrl )
}
}()
然后在调用这个函数的函数处也进行了recover 类似上面的最后一段,结果还是一直给我抛panic程序一直挂,我连日志都看不到。求大神带带,到底哪里不太对劲啊~~~~~
这是一条镜像帖。来源:北邮人论坛 / golang / #774同步于 2017/3/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
菜鸟求教怎么没法处理http请求产生的panic
funkol2007
2017/3/28镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 inaadversity 的大作中提到: 】
: 哥 你的defer放的位置不对, 放在开头就好了。。。
我靠 好吧 我还以为defer放哪都能执行呢。。。怎么放后面就不执行了啊?
我记得多个defer修饰的时候会等其他的都返回它才会返回,表现上就好像被“逆序调用”,如果放在后面反倒会先执行,这时候如果defer httpResp.Body.Close()发生panic就捕捉不到了。
反过来defer func()放在前面就能捉到defer httpResp.Body.Close()中的panic
好久不用了不知道对不对
defer 是在运行时把相应的方法压入一个栈,函数正常返回或panic之后,按照出栈顺序执行所有函数。 放在后面的话都没运行到这个语句,所以就没有入栈行为。
【 在 funkol2007 的大作中提到: 】
:
: 我靠 好吧 我还以为defer放哪都能执行呢。。。怎么放后面就不执行了啊?