From df345447cab7deccddde2225f34ce7b48c283751 Mon Sep 17 00:00:00 2001 From: ZLY Date: Mon, 4 Aug 2025 14:28:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(MessageHandler):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E8=BF=9E=E6=8E=A5=E4=B8=AD=E6=96=AD=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 readMessage 中增加对网络连接中断错误的处理逻辑 - 在 modelApi 中增加对不同错误类型的捕获和处理 - 优化错误信息提示,提高用户体验 --- src/MessageHandler.ts | 26 ++++++++++++++++++++++++-- src/utils/modelApi.ts | 8 +++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/MessageHandler.ts b/src/MessageHandler.ts index 140d3e2..bdf9d8d 100644 --- a/src/MessageHandler.ts +++ b/src/MessageHandler.ts @@ -158,18 +158,27 @@ export class MessageHandler { this.provider._postMessage({command: 'hideLoading'}); return; } - // 如果是其他错误,重新抛出 - throw readError; + // 如果是网络连接中断错误,我们仍然处理已接收的数据 + if (readError.message.includes('terminated') || readError.message.includes('other side closed') || readError.name === 'TypeError') { + // 继续处理已接收的数据 + console.log("网络连接中断,但将继续处理已接收的数据"); + aiMessage += "```" + } else { + // 如果是其他错误,重新抛出 + throw readError; + } } finally { // 清理reader引用 this.currentReader = null; } + // console.log("aiMessage:",aiMessage) // 流传输完成后,更新会话历史 currentSessionHistory = [...currentSessionHistory, {role: 'assistant', content: aiMessage}]; // 解析AI响应中的多个代码块并生成独立的codeDiff信息 const codeBlocks = aiMessage.match(/```[\s\S]*?```/g) || []; + // console.log("codeBlocks:",codeBlocks) // 存储所有生成的codeDiff const allCodeDiffs = []; @@ -184,6 +193,8 @@ export class MessageHandler { } } + // console.log("allCodeDiffs:",allCodeDiffs) + // 通知前端流传输完成 this.provider._postMessage({ @@ -219,9 +230,20 @@ export class MessageHandler { } } } catch (error: any) { + console.log("error:",error) // 检查是否是由于取消请求导致的中断 if (error.name === 'AbortError' || error.message.includes('cancel') || error.message.includes('中断')) { this.provider._postMessage({command: 'requestCancelled'}); + } else if (error.message.includes('terminated') || error.message.includes('other side closed') || error.name === 'TypeError') { + // 处理网络连接中断错误,但仍显示已接收的内容 + this.provider._postMessage({command: 'addMessage', role: 'ai', content: '网络连接中断,但以下为已接收的内容:'}); + // 如果有已接收的内容,也显示出来 + // 通知前端流传输完成 + this.provider._postMessage({ + command: 'endStream', + content: '', + codeDiffs: [] + }); } else { this.provider._postMessage({command: 'addMessage', role: 'ai', content: '调用失败:' + error.message}); } diff --git a/src/utils/modelApi.ts b/src/utils/modelApi.ts index 563d0e6..9574d62 100644 --- a/src/utils/modelApi.ts +++ b/src/utils/modelApi.ts @@ -115,12 +115,18 @@ export async function callQwenAPI( if (!response.ok) { console.log("请求失败:", response) - throw new Error('API 请求失败'); + throw new Error(`API 请求失败: ${response.status} ${response.statusText}`); } return response; } catch (error: any) { console.error(error); + // 提供更具体的错误信息 + if (error.message.includes('terminated') || error.message.includes('other side closed')) { + throw new Error('网络连接中断,请检查网络状况或稍后重试。'); + } else if (error.name === 'TypeError') { + throw new Error(`网络错误: ${error.message}`); + } throw error; } } \ No newline at end of file