2025-03-18 17:57:07 +08:00
|
|
|
|
package web
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-26 14:39:19 +08:00
|
|
|
|
"encoding/json"
|
2025-03-18 17:57:07 +08:00
|
|
|
|
"errors"
|
2026-03-26 14:39:19 +08:00
|
|
|
|
"fmt"
|
2025-04-19 14:59:19 +08:00
|
|
|
|
"log/slog"
|
2025-05-24 12:37:16 +08:00
|
|
|
|
"platform/web/auth"
|
|
|
|
|
|
"platform/web/core"
|
2025-04-19 14:59:19 +08:00
|
|
|
|
"reflect"
|
2026-03-27 16:16:55 +08:00
|
|
|
|
"time"
|
2025-03-18 17:57:07 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func ErrorHandler(c *fiber.Ctx, err error) error {
|
2025-04-19 14:59:19 +08:00
|
|
|
|
|
2025-05-09 11:10:17 +08:00
|
|
|
|
var code = fiber.StatusInternalServerError
|
|
|
|
|
|
var message = "服务器异常"
|
2025-04-19 14:59:19 +08:00
|
|
|
|
|
|
|
|
|
|
var fiberErr *fiber.Error
|
2025-11-17 18:38:10 +08:00
|
|
|
|
var authErr auth.AuthErr
|
2025-05-24 12:37:16 +08:00
|
|
|
|
var bizErr *core.BizErr
|
2025-08-15 18:11:35 +08:00
|
|
|
|
var servErr *core.ServErr
|
2026-03-27 16:16:55 +08:00
|
|
|
|
var timeErr *time.ParseError
|
2026-03-30 14:59:35 +08:00
|
|
|
|
var jsonErr *json.UnmarshalTypeError
|
|
|
|
|
|
var jsonSyntaxErr *json.SyntaxError
|
2025-05-09 11:10:17 +08:00
|
|
|
|
|
|
|
|
|
|
switch {
|
|
|
|
|
|
|
|
|
|
|
|
// fiber 错误
|
|
|
|
|
|
case errors.As(err, &fiberErr):
|
2025-04-19 14:59:19 +08:00
|
|
|
|
code = fiberErr.Code
|
|
|
|
|
|
message = fiberErr.Message
|
2025-05-09 11:10:17 +08:00
|
|
|
|
|
2025-05-24 12:37:16 +08:00
|
|
|
|
// 认证授权错误
|
|
|
|
|
|
case errors.As(err, &authErr):
|
|
|
|
|
|
switch {
|
2025-11-17 18:38:10 +08:00
|
|
|
|
case errors.Is(err, auth.ErrAuthenticateUnauthorize):
|
2025-05-24 12:37:16 +08:00
|
|
|
|
code = fiber.StatusUnauthorized
|
2025-11-17 18:38:10 +08:00
|
|
|
|
case errors.Is(err, auth.ErrAuthenticateForbidden):
|
2025-05-24 12:37:16 +08:00
|
|
|
|
code = fiber.StatusForbidden
|
|
|
|
|
|
default:
|
|
|
|
|
|
code = fiber.StatusBadRequest
|
|
|
|
|
|
}
|
|
|
|
|
|
message = err.Error()
|
|
|
|
|
|
|
2025-08-15 18:11:35 +08:00
|
|
|
|
// 已处理的业务错误
|
2025-05-24 12:37:16 +08:00
|
|
|
|
case errors.As(err, &bizErr):
|
|
|
|
|
|
code = fiber.StatusBadRequest
|
|
|
|
|
|
message = err.Error()
|
2025-08-15 18:11:35 +08:00
|
|
|
|
|
|
|
|
|
|
case errors.As(err, &servErr):
|
|
|
|
|
|
code = fiber.StatusInternalServerError
|
|
|
|
|
|
message = err.Error()
|
2025-05-09 11:10:17 +08:00
|
|
|
|
|
2026-03-30 14:59:35 +08:00
|
|
|
|
case errors.As(err, &timeErr):
|
|
|
|
|
|
code = fiber.StatusBadRequest
|
|
|
|
|
|
message = fmt.Sprintf("时间格式不正确,传入值为 %s,检查传参是否为时间类型", timeErr.Value)
|
|
|
|
|
|
|
2026-03-26 14:39:19 +08:00
|
|
|
|
case errors.As(err, &jsonErr):
|
|
|
|
|
|
code = fiber.StatusBadRequest
|
|
|
|
|
|
message = fmt.Sprintf("参数 %s 类型不正确,传入类型为 %s,正确类型应该为 %s", jsonErr.Field, jsonErr.Value, jsonErr.Type.Name())
|
|
|
|
|
|
|
2026-03-30 14:59:35 +08:00
|
|
|
|
case errors.As(err, &jsonSyntaxErr):
|
2026-03-27 16:16:55 +08:00
|
|
|
|
code = fiber.StatusBadRequest
|
2026-03-30 14:59:35 +08:00
|
|
|
|
message = "参数格式不正确,检查传参是否为 JSON 格式"
|
2026-03-27 16:16:55 +08:00
|
|
|
|
|
2025-05-09 11:10:17 +08:00
|
|
|
|
// 所有未手动声明的错误类型
|
|
|
|
|
|
default:
|
2026-03-27 16:16:55 +08:00
|
|
|
|
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()))
|
2025-03-18 17:57:07 +08:00
|
|
|
|
}
|
2025-04-19 14:59:19 +08:00
|
|
|
|
|
2026-03-27 18:03:19 +08:00
|
|
|
|
slog.Warn(message)
|
2025-03-18 17:57:07 +08:00
|
|
|
|
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
|
|
|
|
|
|
return c.Status(code).SendString(message)
|
|
|
|
|
|
}
|