Skip to content

Error Handling

Error processing here does not refer to stack handling, error management, etc. but rather to HTTP error handling.

Let’s simulate an error in the format code-msg when the error is *errors.CodeMsg.

package main
import (
"go/types"
"net/http"
"github.com/zeromicro/go-zero/rest"
"github.com/zeromicro/go-zero/rest/httpx"
"github.com/zeromicro/x/errors"
xhttp "github.com/zeromicro/x/http"
)
func main() {
srv := rest.MustNewServer(rest.RestConf{
Port: 8080,
})
srv.AddRoute(rest.Route{
Method: http.MethodPost,
Path: "/hello",
Handler: handle,
})
defer srv.Stop()
// httpx.SetErrorHandler is only valid if httpx.Error is called to handle the response.
httpx.SetErrorHandler(func(err error) (int, any) {
switch e := err.(type) {
case *errors.CodeMsg:
return http.StatusOK, xhttp.BaseResponse[types.Nil]{
Code: e.Code,
Msg: e.Msg,
}
default:
return http.StatusInternalServerError, nil
}
})
srv.Start()
}
type HelloRequest struct {
Name string `json:"name"`
}
type HelloResponse struct {
Msg string `json:"msg"`
}
func handle(w http.ResponseWriter, r *http.Request) {
var req HelloRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.Error(w, err)
return
}
if req.Name == "error" {
// mock parameter error
httpx.Error(w, errors.New(400, "dummy error"))
return
}
httpx.OkJson(w, HelloResponse{
Msg: "hello " + req.Name,
})
}
Terminal window
$ curl --location '127.0.0.1:8080/hello' \
--header 'Content-Type: application/json' \
--data '{
"name":"go-zero"
}'
{"msg":"hello go-zero"}
$ curl --location '127.0.0.1:8080/hello' \
--header 'Content-Type: application/json' \
--data '{
"name":"error"
}'
{"code":400,"msg":"dummy error","data":{}}

::tip hint Here is only a demonstration of the usability of httpx.SetErrorHandler , refer to Unified Response Format : :::