終止或中止 HTTP 請求
要處理 API 處理期間的錯誤,終止或中止請求至關重要。雖然像 log.fatal 和 os.Exit 這樣的選項可能會終止整個服務,但它們會阻礙錯誤訊息的傳遞。本文探討了使用panic、defer、recover和return的替代方法。
使用return進行錯誤處理
最簡單的方法是從ServeHTTP()函數傳回:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // Check parameters if !ok { str := `{"Result":"","Error":"Invalid Parameters"}` fmt.Fprint(w, str) return // Terminates the request } // Normal API handling })
這種方法對於主HTTP處理函數來說效果很好,但在巢狀函數中,它只存在函數,而不存在呼叫者。
HTTP 錯誤代碼和自訂回應
考慮回傳適當的 HTTP 錯誤代碼,而不是預設的 200 OK 回應碼。 http.Error()允許自訂錯誤訊息:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if !ok { http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest) return } // Normal API handling })
要進行更精細的控制,您可以設定自訂內容類型和回應正文:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if !ok { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) str := `{"Result":"","Error":"Invalid Input Parameters"}` fmt.Fprint(w, str) return } // Normal API handling })
錯誤傳播使用defer和recover
如果錯誤偵測發生在ServeHTTP()之外,則可以使用defer和recover來傳播將錯誤狀態傳遞給主處理程序:
type params struct { // Parameter fields } func decodeParams(r *http.Request) (*params, error) { p := new(params) defer func() { if r := recover(); r != nil { log.Println(r) return } }() // Parameter decoding if !ok { panic(errors.New("Invalid Parameters")) } return p, nil } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { p, err := decodeParams(r) if err != nil { http.Error(w, `Invalid Input Parameters!`, http.StatusBadRequest) return } // Normal API handling })
在這種方法中,defer註冊了一個清理函數,以確保不管函數傳回還是panic,recover() 函數都會被執行。如果decodeParams偵測到無效參數,它會發生恐慌,有效地從ServeHTTP()傳回錯誤並允許它傳回錯誤訊息。
以上是如何在 Go 中優雅地處理和終止 HTTP 請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!