@@ -4,14 +4,33 @@ use sea_orm::DbErr;
44use serde:: Serialize ;
55use std:: fmt;
66
7+ /// 应用程序的统一错误类型
78#[ derive( Debug ) ]
89pub enum AppError {
10+ /// 数据库相关错误
911 DbError ( DbErr ) ,
12+ /// JWT 相关错误
1013 JwtError ( JwtError ) ,
14+ /// 校验失败错误,包含错误信息
1115 ValidationError ( String ) ,
16+ /// 资源未找到错误,包含错误信息
1217 NotFound ( String ) ,
18+ /// 未授权访问错误,包含错误信息
1319 Unauthorized ( String ) ,
20+ /// 内部服务器错误,包含错误信息
1421 InternalError ( String ) ,
22+ /// 解析错误,包含错误信息
23+ ParseError ( String ) ,
24+ /// 冲突错误,包含错误信息
25+ Conflict ( String ) ,
26+ /// 禁止访问错误,包含错误信息
27+ Forbidden ( String ) ,
28+ /// 请求超时错误,包含错误信息
29+ Timeout ( String ) ,
30+ /// 错误请求,包含错误信息
31+ BadRequest ( String ) ,
32+ /// 服务不可用,包含错误信息
33+ ServiceUnavailable ( String ) ,
1534}
1635
1736#[ derive( Serialize ) ]
@@ -23,12 +42,18 @@ struct ErrorResponse {
2342impl fmt:: Display for AppError {
2443 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
2544 match self {
26- AppError :: DbError ( e) => write ! ( f, "Database error: {}" , e ) ,
27- AppError :: JwtError ( e) => write ! ( f, "Token error: {}" , e ) ,
45+ AppError :: DbError ( e) => write ! ( f, "{e}" ) ,
46+ AppError :: JwtError ( e) => write ! ( f, "{e}" ) ,
2847 AppError :: ValidationError ( m)
2948 | AppError :: NotFound ( m)
3049 | AppError :: Unauthorized ( m)
31- | AppError :: InternalError ( m) => write ! ( f, "{}" , m) ,
50+ | AppError :: InternalError ( m)
51+ | AppError :: ParseError ( m)
52+ | AppError :: Conflict ( m)
53+ | AppError :: Forbidden ( m)
54+ | AppError :: Timeout ( m)
55+ | AppError :: BadRequest ( m)
56+ | AppError :: ServiceUnavailable ( m) => write ! ( f, "{m}" ) ,
3257 }
3358 }
3459}
@@ -37,9 +62,15 @@ impl ResponseError for AppError {
3762 fn status_code ( & self ) -> StatusCode {
3863 match self {
3964 AppError :: DbError ( _) | AppError :: InternalError ( _) => StatusCode :: INTERNAL_SERVER_ERROR ,
40- AppError :: ValidationError ( _) => StatusCode :: BAD_REQUEST ,
65+ AppError :: ValidationError ( _) | AppError :: ParseError ( _) | AppError :: BadRequest ( _) => {
66+ StatusCode :: BAD_REQUEST
67+ }
4168 AppError :: NotFound ( _) => StatusCode :: NOT_FOUND ,
4269 AppError :: Unauthorized ( _) | AppError :: JwtError ( _) => StatusCode :: UNAUTHORIZED ,
70+ AppError :: Conflict ( _) => StatusCode :: CONFLICT ,
71+ AppError :: Forbidden ( _) => StatusCode :: FORBIDDEN ,
72+ AppError :: Timeout ( _) => StatusCode :: REQUEST_TIMEOUT ,
73+ AppError :: ServiceUnavailable ( _) => StatusCode :: SERVICE_UNAVAILABLE ,
4374 }
4475 }
4576 fn error_response ( & self ) -> HttpResponse {
@@ -50,7 +81,6 @@ impl ResponseError for AppError {
5081 }
5182}
5283
53- // 自动从 sea_orm::DbErr & jsonwebtoken::Error 转换
5484impl From < DbErr > for AppError {
5585 fn from ( e : DbErr ) -> Self {
5686 AppError :: DbError ( e)
@@ -61,3 +91,9 @@ impl From<JwtError> for AppError {
6191 AppError :: JwtError ( e)
6292 }
6393}
94+
95+ impl From < std:: num:: ParseIntError > for AppError {
96+ fn from ( e : std:: num:: ParseIntError ) -> Self {
97+ AppError :: ParseError ( format ! ( "{e}" ) )
98+ }
99+ }
0 commit comments