Kaynağa Gözat

使用anyhow处理错误,更优雅

skyffire 6 ay önce
ebeveyn
işleme
38d82cdbaf
1 değiştirilmiş dosya ile 19 ekleme ve 43 silme
  1. 19 43
      src/main.rs

+ 19 - 43
src/main.rs

@@ -12,7 +12,7 @@ use std::collections::{HashMap, HashSet};
 use backtrace::Backtrace;
 use std::sync::Arc;
 use std::sync::atomic::{AtomicBool, Ordering};
-use anyhow::anyhow;
+use anyhow::{anyhow, Context};
 use anyhow::Result;
 use serde_json::Value;
 use tracing::{error, info, warn};
@@ -120,52 +120,28 @@ pub async fn run_mexc_subscriptions(
     let default_symbols_response = rest_client.default_symbols().await;
     // info!("获取到的 default_symbols_value: {}", serde_json::to_string_pretty(&default_symbols_response.data).unwrap());
 
-    let exchange_info_response = rest_client.exchange_info(serde_json::Value::Null).await;
+    let exchange_info_response = rest_client.exchange_info(Value::Null).await;
     // info!("获取到的 exchange_info_data: {}", serde_json::to_string_pretty(&exchange_info_response.data).unwrap());
-    // 调用处理函数,注意现在传入的是 &Value
-
-    match process_exchange_info(&default_symbols_response.data, &exchange_info_response.data) {
-        Ok(filtered_map) => {
-            info!("成功过滤并转换了交易对信息,最终数量: {}", filtered_map.len());
-
-            // 使用 filtered_map...
-            if let Some(symbol_info) = filtered_map.get("BTCUSDT") { // 示例
-                let pretty_info = serde_json::to_string_pretty(symbol_info).unwrap_or_else(|e| format!("序列化错误: {}", e));
-                info!("BTCUSDT 的信息: {}", pretty_info);
-            } else if !filtered_map.is_empty() {
-                if let Some((first_key, first_value)) = filtered_map.iter().next() {
-                    let pretty_info = serde_json::to_string_pretty(first_value).unwrap_or_else(|e| format!("序列化错误: {}", e));
-                    info!("过滤后 map 中的第一个交易对 '{}' 的信息: {}", first_key, pretty_info);
-                }
-            } else {
-                info!("过滤后的 Map 为空。");
-            }
-
-        }
-        Err(e) => {
-            error!("处理交易所信息时发生错误: {}", e);
-            return Err(e);
+    
+    // 调用过滤函数,注意现在传入的是 &Value
+    let filtered_map = process_exchange_info(&default_symbols_response.data, &exchange_info_response.data)
+        .context("处理交易所信息时发生错误")?;
+    info!("成功过滤并转换了交易对信息,最终数量: {}", filtered_map.len());
+    // 使用 filtered_map...
+    if let Some(symbol_info) = filtered_map.get("BTCUSDT") { // 示例
+        let pretty_info = serde_json::to_string_pretty(symbol_info).unwrap_or_else(|e| format!("序列化错误: {}", e));
+        info!("BTCUSDT 的信息: {}", pretty_info);
+    } else if !filtered_map.is_empty() {
+        if let Some((first_key, first_value)) = filtered_map.iter().next() {
+            let pretty_info = serde_json::to_string_pretty(first_value).unwrap_or_else(|e| format!("序列化错误: {}", e));
+            info!("过滤后 map 中的第一个交易对 '{}' 的信息: {}", first_key, pretty_info);
         }
+    } else {
+        return Err(anyhow!("未能获取到任何有效的交易对,请检查网络或 API 接口。"));
     }
 
-
-    // // 提取交易对名称 (例如 "BTC_USDT")
-    // // 假设 SymbolInfo 结构体有一个名为 `symbol` 的 String 字段
-    // // 同时,我们可能需要过滤掉一些不活跃或不交易的交易对(根据API返回的状态字段)
-    // let symbols: Vec<String> = symbols_info
-    //     .iter()
-    //     // .filter(|info| info.status == "ENABLED") // 假设有状态字段可以过滤
-    //     .map(|info| info.symbol.clone()) // 假设字段名为 symbol
-    //     .collect();
-    //
-    // if symbols.is_empty() {
-    //     warn!("未能获取到任何有效的交易对,请检查网络或 API 接口。");
-    //     // 根据情况决定是否需要停止程序
-    //     // running.store(false, Ordering::Relaxed);
-    //     return false; // 或者返回特定错误
-    // }
-    //
-    // info!("成功获取 {} 个交易对,准备订阅 1 分钟 K 线...", symbols.len());
+    let symbols: Vec<String> = filtered_map.keys().cloned().collect();
+    info!("成功获取 {} 个交易对,准备订阅 1 分钟 K 线...", symbols.len());
 
     // // 2. 按规则订阅所有交易对的 1Min K 线
     // // WsManager 应该负责处理如何将这些订阅分散到多个 WebSocket 连接上