Files
platform/web/error.go

86 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 timeErr *time.ParseError
var jsonErr *json.UnmarshalTypeError
var jsonSyntaxErr *json.SyntaxError
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, &timeErr):
code = fiber.StatusBadRequest
message = fmt.Sprintf("时间格式不正确,传入值为 %s检查传参是否为时间类型", timeErr.Value)
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, &jsonSyntaxErr):
code = fiber.StatusBadRequest
message = "参数格式不正确,检查传参是否为 JSON 格式"
// 所有未手动声明的错误类型
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()))
}
slog.Warn(message)
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
return c.Status(code).SendString(message)
}