RUST 基于map_err的卫语句错误处理方式
- 使用扩展方法
use tracing::error;
use eyre::Result;pub trait LogErrExt<T> {/// 记录错误日志后返回原 Result/// /// error!("[{}] 错误详情: {}", context, e);fn log_err(self, context: &str) -> Result<T>;
}impl<T> LogErrExt<T> for Result<T> {fn log_err(self, context: &str) -> Result<T> {self.map_err(|e| {error!("[{}] 错误详情: {}", context, e);e})}
}
- 使用卫语句, 避免了大量match写法 或者if else嵌套
tokio::spawn(async move {let mut interval = interval(Duration::from_secs(60));let lbank_client = LBankClient::new();loop {interval.tick().await;info!(">>>>>===== start thread A working: get fibo_usdt price =====>>>>>");let Ok(ticker_data) = <LBankClient as LBank>::get_ticker_price(&lbank_client).await.log_err("thread A: get_ticker_price") else {continue;};let Some(ticker) = ticker_data.get(0) else {error!("thread A: get_ticker_price: ticker is none");continue;};if ticker.symbol != "fibo_usdt" {error!("thread A: get_ticker_price: symbol != fibo_usdt");continue;};let Ok(price) = ticker.price.parse::<f64>() else {error!("thread A: get_ticker_price: price parse f64 error");continue;};if price == 0.0 {error!("thread A: get_ticker_price: price == 0");continue;}if let Err(_) = FiboPrice::create(ticker.price.clone()).await.log_err("thread A: FiboPrice::create") {continue;}info!("thread A: successful record fibo_usdt price={}", ticker.price);}});