package web import ( "errors" "log/slog" "platform/web/auth" "platform/web/core" "reflect" "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.AuthenticationErr var bizErr *core.BizErr switch { // fiber 错误 case errors.As(err, &fiberErr): code = fiberErr.Code message = fiberErr.Message // 认证授权错误 case errors.As(err, &authErr): switch { case errors.Is(err, auth.ErrUnauthorize): code = fiber.StatusUnauthorized case errors.Is(err, auth.ErrForbidden): code = fiber.StatusForbidden default: code = fiber.StatusBadRequest } message = err.Error() // 服务错误 case errors.As(err, &bizErr): code = fiber.StatusBadRequest message = err.Error() slog.Debug("服务错误", slog.Any(slog.SourceKey, bizErr.Source())) // 所有未手动声明的错误类型 default: slog.Warn("未处理的异常", slog.String("type", reflect.TypeOf(err).Name()), slog.String("error", err.Error())) } c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8) return c.Status(code).SendString(message) }