Skip to content

Commit ca0d0ee

Browse files
committed
报错的时候可以打印出调用堆栈
1 parent 5611d8b commit ca0d0ee

File tree

3 files changed

+88
-36
lines changed

3 files changed

+88
-36
lines changed

src/app.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::net::SocketAddr;
22
use std::time::Duration;
33
use axum::response::{Html, IntoResponse, Response};
44
use axum::{Json, Router};
5+
use axum::body::to_bytes;
56
use axum::http::{header, Request, StatusCode};
67
use axum::middleware::Next;
78
use axum::routing::get;
@@ -15,6 +16,7 @@ use crate::errors::ErrResponse;
1516
use crate::conf::Configuration;
1617
use crate::{example, services};
1718
use crate::redis::{RedisHolder, RedisSession};
19+
use redis::AsyncCommands;
1820

1921
#[derive(Clone)]
2022
pub struct AppContext {}

src/errors.rs

Lines changed: 84 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ use serde_json::{Error as JsonError, Value};
1111
use utoipa::ToSchema;
1212
use serde_json::json;
1313
use 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)]
1620
pub(crate) struct ErrResponse {
@@ -19,21 +23,35 @@ pub(crate) struct ErrResponse {
1923

2024
#[derive(Debug)]
2125
pub 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

3351
impl 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

4664
impl 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

5270
impl 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

5876
impl 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

6482
impl 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: {} \nBacktrace:\n{}", source, backtrace)
95+
},
96+
AppError::RedisError { source, backtrace } => {
97+
write!(f, "Redis Error: {} \nBacktrace:\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: {} \nBacktrace:\n{}", source, backtrace)
107+
}
108+
AppError::JsonError { source, backtrace } => {
109+
write!(f, "Json Parse Error: {} \nBacktrace:\n{}", source, backtrace)
110+
}
111+
AppError::UuidError { source, backtrace } => {
112+
write!(f, "Uuid Parse Error: {} \nBacktrace:\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

71124
impl 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
};

src/services/example_service.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,8 @@ impl Service for ExampleServices {
1919

2020
impl ExampleServices {
2121
pub(crate) async fn test(&self) -> APIResult<()> {
22-
UserLogin{
23-
username: "Alex".to_string(),
24-
password: "123".to_string(),
25-
ts: current_ts(),
26-
}.insert_bind().execute(&self.db).await?;
27-
info!("Running test");
22+
let user = UserLogin::where_query("name=$1").bind("test").fetch_one(&self.db).await?;
23+
info!("Running test:{:?}", user);
2824
Ok(())
2925
}
3026

0 commit comments

Comments
 (0)