终止或中止 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中文网其他相关文章!