В Gorilla с помощью RecoveryHandler мы могли подавить панику. Однако существует ли обработчик или библиотечный метод для ответа с определенным кодом состояния Http и сообщением для данного типа ошибки.
Например, в случае паники для Mandatory field missing error
можно было бы ответить Http 400
и осмысленным сообщением что именно не так с полезной нагрузкой.
Каков рекомендуемый подход для этого?
ОБНОВЛЕНИЕ В коде: перечислены 2 подхода
- Обрабатывайте ошибки, возвращаемые при каждом вызове метода, и формируйте ответ.
- Вместо того, чтобы возвращать ошибки, паникуйте с пользовательскими типами ошибок и отложите устранение ошибок до функции, чтобы построить ответ. Это делает код легко читаемым и менее повторяющимся.
func fooHandler(w http.ResponseWriter, r *http.Request) {
//decode the request body into a struct instance
if err := decode(r, myInstance); err != nil {
sendErrorResponse(w,err,http.StatusBadRequest)
return
}
//validate the struct instance for all mandatory keys presence
if err := file.validate(); err != nil {
sendErrorResponse(w,err,http.StatusBadRequest)
return
}
//call DB and validate the response and handle the error
//do some computation and again handle error.
//finally construct response
}
func barHandler(w http.ResponseWriter, r *http.Request) {
//similar to above handler many funcs are called before the response is contruscted
}
func tomHandler(w http.ResponseWriter, r *http.Request) {
//similar to above handler many funcs are called before the response is contruscted
}
func differentHandler(w http.ResponseWriter, r *http.Request) {
defer recoverForErrors(w,r)
// call as many funcs as you need.
// validation, decoding etc will panic instead of returning errors.
// This will avoid the repetitive boiler plate code of handling error and converting to meaningful error response
// instead all this logic is pushed to recoverForErrors func. Which retrieves the error from panic and checks for
// specific error type to construct the error http response
}