@@ -11,6 +11,10 @@ use serde_json::{Error as JsonError, Value};
1111use utoipa:: ToSchema ;
1212use serde_json:: json;
1313use uuid:: Error as UuidError ;
14+ use std:: backtrace:: Backtrace ;
15+ use std:: fmt;
16+ use clap:: ArgAction :: Append ;
17+ use clap:: parser:: ValueSource ;
1418
1519#[ derive( Serialize , Deserialize , ToSchema ) ]
1620pub ( crate ) struct ErrResponse {
@@ -19,21 +23,35 @@ pub(crate) struct ErrResponse {
1923
2024#[ derive( Debug ) ]
2125pub enum AppError {
22- DbError ( Error ) ,
23- RedisError ( RedisError ) ,
26+ DbError {
27+ source : Error ,
28+ backtrace : Backtrace ,
29+ } ,
30+ RedisError {
31+ source : RedisError ,
32+ backtrace : Backtrace ,
33+ } ,
2434 LogicError ( String ) ,
2535 AuthError ,
26- HttpError ( HttpError ) ,
27- JsonError ( JsonError ) ,
28- UuidError ( UuidError ) ,
36+ HttpError {
37+ source : HttpError ,
38+ backtrace : Backtrace ,
39+ } ,
40+ JsonError {
41+ source : JsonError ,
42+ backtrace : Backtrace ,
43+ } ,
44+ UuidError {
45+ source : UuidError ,
46+ backtrace : Backtrace , } ,
2947 NotFound ,
3048 LoginFailure ,
3149}
3250
3351impl From < Error > for AppError {
3452 fn from ( value : Error ) -> Self {
3553 error ! ( "数据库错误:{:?}" , value) ;
36- Self :: DbError ( value)
54+ Self :: DbError { source : value, backtrace : Backtrace :: capture ( ) }
3755 }
3856}
3957
@@ -45,50 +63,86 @@ impl From<String> for AppError {
4563
4664impl From < RedisError > for AppError {
4765 fn from ( value : RedisError ) -> Self {
48- Self :: RedisError ( value)
66+ Self :: RedisError { source : value, backtrace : Backtrace :: capture ( ) }
4967 }
5068}
5169
5270impl From < HttpError > for AppError {
5371 fn from ( value : HttpError ) -> Self {
54- Self :: HttpError ( value)
72+ Self :: HttpError { source : value, backtrace : Backtrace :: capture ( ) }
5573 }
5674}
5775
5876impl From < JsonError > for AppError {
5977 fn from ( value : JsonError ) -> Self {
60- Self :: JsonError ( value)
78+ Self :: JsonError { source : value, backtrace : Backtrace :: capture ( ) }
6179 }
6280}
6381
6482impl From < UuidError > for AppError {
6583 fn from ( value : UuidError ) -> Self {
6684 error ! ( "Uuid错误:{:?}" , value) ;
67- Self :: UuidError ( value)
85+ Self :: UuidError { source : value, backtrace : Backtrace :: capture ( ) }
86+ }
87+ }
88+
89+
90+ impl fmt:: Display for AppError {
91+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
92+ match self {
93+ AppError :: DbError { source, backtrace } => {
94+ write ! ( f, "Database Error: {} \n Backtrace:\n {}" , source, backtrace)
95+ } ,
96+ AppError :: RedisError { source, backtrace } => {
97+ write ! ( f, "Redis Error: {} \n Backtrace:\n {}" , source, backtrace)
98+ }
99+ AppError :: LogicError ( msg) => {
100+ write ! ( f, "Logic Error: {msg}" )
101+ }
102+ AppError :: AuthError => {
103+ write ! ( f, "Auth Error" )
104+ }
105+ AppError :: HttpError { source, backtrace } => {
106+ write ! ( f, "Http Error: {} \n Backtrace:\n {}" , source, backtrace)
107+ }
108+ AppError :: JsonError { source, backtrace } => {
109+ write ! ( f, "Json Parse Error: {} \n Backtrace:\n {}" , source, backtrace)
110+ }
111+ AppError :: UuidError { source, backtrace } => {
112+ write ! ( f, "Uuid Parse Error: {} \n Backtrace:\n {}" , source, backtrace)
113+ }
114+ AppError :: NotFound => {
115+ write ! ( f, "Not Found" )
116+ }
117+ AppError :: LoginFailure => {
118+ write ! ( f, "Login Failure" )
119+ }
120+ }
68121 }
69122}
70123
71124impl IntoResponse for AppError {
72125 fn into_response ( self ) -> Response {
126+ eprintln ! ( "Error: {}" , self ) ;
73127 let resp = match self {
74- Self :: DbError ( de ) =>{
75- if let Error :: RowNotFound = de {
76- error ! ( "查询记录不存在:{:?}" , de ) ;
128+ Self :: DbError { source , backtrace } =>{
129+ if let Error :: RowNotFound = source {
130+ // error!("查询记录不存在:{:?} {:?} ", source, backtrace );
77131 (
78132 StatusCode :: NOT_FOUND ,
79- Json ( json ! ( ErrResponse { info: format!( "{de :?}" ) } ) )
133+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
80134 )
81135 } else {
82- error ! ( "数据库错误:{:?}" , de ) ;
136+ // error!("数据库错误:{:?} {:?} ", source, backtrace );
83137 (
84138 StatusCode :: INTERNAL_SERVER_ERROR ,
85- Json ( json ! ( ErrResponse { info: format!( "{de :?}" ) } ) )
139+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
86140 )
87141
88142 }
89143 } ,
90144 Self :: LogicError ( msg) =>{
91- error ! ( "业务错误:{}" , msg) ;
145+ // error!("业务错误:{}", msg);
92146 (
93147 StatusCode :: INTERNAL_SERVER_ERROR ,
94148 Json ( json ! ( ErrResponse { info: msg} ) )
@@ -106,39 +160,39 @@ impl IntoResponse for AppError {
106160 Json ( json ! ( ErrResponse { info: "用户名密码错误" . to_string( ) } ) )
107161 )
108162 } ,
109- Self :: RedisError ( re ) =>{
110- error ! ( "Redis错误:{:?}" , re ) ;
163+ Self :: RedisError { source , backtrace } =>{
164+ // error!("Redis错误:{:?}, {:?} ", source, backtrace );
111165 (
112166 StatusCode :: INTERNAL_SERVER_ERROR ,
113- Json ( json ! ( ErrResponse { info: format!( "{re :?}" ) } ) )
167+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
114168 )
115169 } ,
116- Self :: HttpError ( he ) =>{
117- error ! ( "HTTP请求错误:{:?}" , he ) ;
170+ Self :: HttpError { source , backtrace } =>{
171+ // error!("HTTP请求错误:{:?} {:?} ", source, backtrace );
118172 (
119173 StatusCode :: INTERNAL_SERVER_ERROR ,
120- Json ( json ! ( ErrResponse { info: format!( "{he :?}" ) } ) )
174+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
121175 )
122176 } ,
123- Self :: JsonError ( je ) =>{
124- error ! ( "Json反序列化错误:{:?}" , je ) ;
177+ Self :: JsonError { source , backtrace } =>{
178+ // error!("Json反序列化错误:{:?} {:?} ", source, backtrace );
125179 (
126180 StatusCode :: INTERNAL_SERVER_ERROR ,
127- Json ( json ! ( ErrResponse { info: format!( "{je :?}" ) } ) )
181+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
128182 )
129183 } ,
130184 Self :: NotFound =>{
131- error ! ( "Not found error" ) ;
185+ // error!("Not found error");
132186 (
133187 StatusCode :: NOT_FOUND ,
134188 Json ( json ! ( ErrResponse { info: "请求的资源不存在" . to_string( ) } ) )
135189 )
136190 } ,
137- Self :: UuidError ( ue ) =>{
138- error ! ( "Uuid错误:{:?}" , ue ) ;
191+ Self :: UuidError { source , backtrace } =>{
192+ // error!("Uuid错误:{:?} {:?} ", source, backtrace );
139193 (
140194 StatusCode :: INTERNAL_SERVER_ERROR ,
141- Json ( json ! ( ErrResponse { info: format!( "{ue :?}" ) } ) )
195+ Json ( json ! ( ErrResponse { info: format!( "{source :?}" ) } ) )
142196 )
143197 }
144198 } ;
0 commit comments