From 8785cc609778a6a327986b09ecaff4a350256f03 Mon Sep 17 00:00:00 2001 From: imeepos Date: Fri, 15 Aug 2025 18:54:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=B9=E9=94=99=20J?= =?UTF-8?q?SON=20=E8=A7=A3=E6=9E=90=E5=99=A8=E7=9A=84=20Mutex=20=E6=B1=A1?= =?UTF-8?q?=E6=9F=93=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换 unwrap() 为适当的错误处理,避免 PoisonError 导致的 panic - 在 Mutex 被污染时返回友好的错误信息而不是崩溃 - 提高 VEO3 角色文件创建功能的稳定性 --- .../commands/tolerant_json_commands.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src-tauri/src/presentation/commands/tolerant_json_commands.rs b/apps/desktop/src-tauri/src/presentation/commands/tolerant_json_commands.rs index f4ffe36..95cb9fd 100644 --- a/apps/desktop/src-tauri/src/presentation/commands/tolerant_json_commands.rs +++ b/apps/desktop/src-tauri/src/presentation/commands/tolerant_json_commands.rs @@ -99,7 +99,9 @@ impl JsonParserState { /// 获取或创建解析器实例 fn get_or_create_parser(&self, config: Option) -> Result<()> { - let mut parser_guard = self.parser.lock().unwrap(); + let mut parser_guard = self.parser.lock().map_err(|_| { + anyhow::anyhow!("Failed to acquire parser lock") + })?; // 每次都创建新的解析器实例以确保使用正确的配置 let parser = TolerantJsonParser::new(config)?; @@ -132,7 +134,18 @@ pub async fn parse_json_tolerant( } // 执行解析 - let mut parser_guard = state.parser.lock().unwrap(); + let mut parser_guard = match state.parser.lock() { + Ok(guard) => guard, + Err(_) => { + error!("Failed to acquire parser lock, mutex is poisoned"); + return Ok(ParseJsonResponse { + success: false, + data: None, + statistics: None, + error: Some("Parser lock is poisoned, please restart the application".to_string()), + }); + } + }; if let Some(ref mut parser) = *parser_guard { info!("Starting JSON parsing for text: {}", &request.text[..std::cmp::min(100, request.text.len())]); match parser.parse(&request.text) {