【发布时间】:2017-05-07 11:22:17
【问题描述】:
我对使用 golang 进行编码还很陌生,并且正在为错误的 url 请求处理恐慌/恢复过程。下面是一个查询 URL 列表并输出响应的脚本。有时会输入错误的 url 或服务器关闭,并且 HTTP 请求失败,这会导致恐慌。我不清楚如何从中恢复并继续。我希望程序从恐慌中恢复,记录错误的 url 和错误,并继续输出失败的 url 和错误的 url 列表以及其余正常 url 响应数据。
package main
import (
"fmt"
"net/http"
)
var urls = []string{
"http://www.google.com", //good url, 200
"http://www.googlegoogle.com/", //bad url
"http://www.zoogle.com", //500 example
}
//CONCURRENT HTTP REQUESTS -------------------------------------------
func MakeRequest(url string, ch chan<- string) {
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error Triggered", err)
ch <- fmt.Sprintf("err: %s", err)
}
ch <- fmt.Sprintf("url: %s, status: %s ", url, resp.Status) // put response into a channel
resp.Body.Close()
}
func main() {
output := make([][]string, 0) //define an array to hold responses
//PANIC RECOVER------------------------------
defer func() { //catch or finally
if r := recover(); r != nil { //catch
fmt.Println("Recover Triggered: ", r)
}
}()
//MAKE URL REQUESTS----------------------------------------------
for _, url := range urls {
ch := make(chan string) //create a channel for each request
go MakeRequest(url, ch) //make concurrent http request
output = append(output, []string{<-ch}) //append output to an array
}
//PRINT OUTPUT ----------------------
for _, value := range output {
fmt.Println(value)
}
}
我正在寻找类似于以下内容的输出:
[网址:http://www.google.com,状态:200 OK]
[url:http://www.googlegoogle.com,错误:没有这样的主机]
[url:http://www.zoogle.com,状态:500 内部服务器错误]
【问题讨论】:
-
除非您出于某种原因特别恐慌,否则恐慌表明您的程序中有错误。修复错误,这样您就不会出现任何需要恢复的恐慌。
-
该逻辑有帮助,看起来在出现错误的情况下,我没有什么可以为 resp.Status 输入“ch”。如果我修改错误处理恐慌停止,我可以弄清楚如何解决。
-
resp 不仅可以在 err 不为 nil 时返回 nil,而且要注意,如果 err 不为 nil,则 resp 可能不为 nil,但如果您尝试取消引用,则会导致恐慌它!对于这个函数调用,它并不是专门采用这种方式,但是文件 walker 接口确实有这种行为(至少在旧版本的 go 中),当 err 不是 nil 时,返回的另一个值不是 nil,但它是无法取消引用的垃圾值。
-
我尝试使用 recover() ,然后从他们那里返回,但没有成功。
标签: http go request recover panic