我對golang編碼相當陌生,並且正在爲恐慌/恢復過程尋求錯誤的url請求而掙扎。以下是查詢URL列表並輸出響應的腳本。有時會輸入錯誤的URL或服務器關閉,並且HTTP請求失敗會導致恐慌。我不清楚如何從中恢復並繼續。我想讓程序從恐慌中恢復,記錄錯誤的URL和錯誤,然後繼續輸出失敗的url和錯誤信息,並返回其他正常url響應數據的url列表。golang http請求錯誤恐慌恢復
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)
}
}
我正在尋找類似的輸出:
[URL:http://www.google.com,狀態:200 OK]
[URL:http://www.googlegoogle.com,ERR:沒有這樣的主持人]
[ url:http://www.zoogle.com,狀態:500內部服務器錯誤]
除非您由於某種原因特別恐慌,否則恐慌表示程序中有錯誤。修復錯誤,使您不會有任何恐慌情緒從中恢復。 – JimB
這個邏輯有幫助,看起來像一個錯誤的情況下,我沒有什麼可以爲resp.Status放入「ch」。 如果我改變處理恐慌停止的錯誤,我可以弄清楚如何解決。 –
如果err不爲零,那麼不僅可以resp回零,但要注意,如果err不是零,那麼resp可能不是零,但是如果嘗試解引用它,會導致恐慌!它並不是專門爲這個函數調用的方式,但文件walker接口確實有這種行爲(至少在go的舊版本中),當err不爲零時,返回的另一個值不是零,但它是一個垃圾值無法解除引用。 – Rob