gpt4 book ai didi

http - golang http请求错误panic recover

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:23 28 4
gpt4 key购买 nike

我对使用 golang 进行编码还很陌生,并且正在为错误的 url 请求而在 panic/recover 过程中苦苦挣扎。下面是一个查询 URL 列表并输出响应的脚本。偶尔会输入错误的 url 或服务器关闭,HTTP 请求失败,从而导致 panic 。我不清楚如何从中恢复并继续。我希望程序从 panic 中恢复,记录错误的 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 ]

[网址:http://www.googlegoogle.com , 错误:没有这样的主机]

[网址:http://www.zoogle.com ,状态:500 内部服务器错误]

最佳答案

谢谢 Jim B。我假设 panic 是由请求触发的,但这是尝试对失败的请求使用“resp.Status”,因为它不存在。我修改了我的错误处理,如果没有错误,只在“ch”中放置一个 resp.Status。在出现错误的情况下,我用错误值将不同的响应替换为“ch”。无需恢复,因为没有触发 panic 。

func MakeRequest(url string, ch chan<- string) {
resp, err := http.Get(url)
if err != nil {
ch <- fmt.Sprintf("url: %s, err: %s ", url, err)
} else {
ch <- fmt.Sprintf("url: %s, status: %s ", url, resp.Status) // put response into a channel
defer resp.Body.Close()
}
}

现在的输出是:

[网址:http://www.google.com , 状态: 200 OK ]

[网址:http://www.googlegoogle.com/ ,错误:获取http://www.googlegoogle.com/ : dial tcp: lookup www.googlegoogle.com: 没有这样的主机]

[网址:http://www.zoogle.com ,状态:500 内部服务器错误]

关于http - golang http请求错误panic recover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com