package web import ( "encoding/json" "errors" "fmt" "log/slog" "platform/web/auth" "platform/web/core" "reflect" "time" "github.com/gofiber/fiber/v2" ) func ErrorHandler(c *fiber.Ctx, err error) error { var code = fiber.StatusInternalServerError var message = "服务器异常" var fiberErr *fiber.Error var authErr auth.AuthErr var bizErr *core.BizErr var servErr *core.ServErr var jsonErr *json.UnmarshalTypeError var timeErr *time.ParseError switch { // fiber 错误 case errors.As(err, &fiberErr): code = fiberErr.Code message = fiberErr.Message // 认证授权错误 case errors.As(err, &authErr): switch { case errors.Is(err, auth.ErrAuthenticateUnauthorize): code = fiber.StatusUnauthorized case errors.Is(err, auth.ErrAuthenticateForbidden): code = fiber.StatusForbidden default: code = fiber.StatusBadRequest } message = err.Error() // 已处理的业务错误 case errors.As(err, &bizErr): code = fiber.StatusBadRequest message = err.Error() case errors.As(err, &servErr): code = fiber.StatusInternalServerError message = err.Error() case errors.As(err, &jsonErr): code = fiber.StatusBadRequest message = fmt.Sprintf("参数 %s 类型不正确,传入类型为 %s,正确类型应该为 %s", jsonErr.Field, jsonErr.Value, jsonErr.Type.Name()) case errors.As(err, &timeErr): code = fiber.StatusBadRequest message = fmt.Sprintf("时间格式不正确,传入值为 %s,检查传参是否为时间类型", timeErr.Value) // 所有未手动声明的错误类型 default: t := reflect.TypeOf(err) for { if t.Kind() == reflect.Pointer { t = t.Elem() continue } break } slog.Warn("未处理的异常", slog.String("type", t.String()), slog.String("error", err.Error())) } c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8) return c.Status(code).SendString(message) }