Browse Source

添加异常处理

cc12458 2 months ago
parent
commit
23deff0b3e

+ 14 - 0
src/modules/chat/renderer/ChatSender.vue

@@ -3,6 +3,7 @@ import { Sender } from 'ant-design-x-vue';
 import type { MessageRendererEmits, MessageRendererProps } from '@/modules/chat/renderer/index.ts';
 import { useFetchForSSE } from '@/request/sse';
 import type { Method } from 'alova';
+import { Toast } from '@/platform';
 import { useMessagesContext } from '@/modules/chat/composables';
 import { randomUUID } from '@/tools';
 import GuideContent from '@/modules/chat/renderer/GuideContent.vue';
@@ -66,13 +67,26 @@ onMessage<{ content: string }>(({ data }) => {
     });
   }
 });
+let forbidOver = false;
+
+on('error', ({ data }) => {
+  forbidOver = true;
+  Toast.error(data.message);
+  update({
+    key: key.value,
+    content: data.message,
+    onTypingComplete() {},
+  });
+});
 on('over', () => {
+  if (forbidOver) return;
   over.value = true;
   emits('next');
 });
 
 const onSubmit = (value: string) => {
   append({ role: 'user', content: value });
+  forbidOver = false;
   content.value = '';
   message.value = '';
   over.value = false;

+ 12 - 3
src/request/api/analysis.ts

@@ -1,6 +1,6 @@
 import { analysis } from '@/request';
 import type { AnalysisHealthKey, AnalysisHealthModel } from '@/modules/chat/types';
-import type { AnalysisHealthReportModel } from '@/request/model/analysis-health.model.ts';
+import type { AnalysisHealthReportError, AnalysisHealthReportModel } from '@/request/model/analysis-health.model.ts';
 import { camelToUnderline } from '@/tools';
 
 export function analysisHealthMethod(model: AnalysisHealthModel) {
@@ -31,7 +31,9 @@ export function analysisHealthMethod(model: AnalysisHealthModel) {
       }
 
       const result: AnalysisHealthReportModel = {};
-      if (data.tongue_str)
+      const error: AnalysisHealthReportError = {};
+      if (data.tongue_str.startsWith(`图像检测失败`)) error.tongue = data.tongue_str.replace('图像', '舌象');
+      else if (data.tongue_str)
         result.tongue = {
           result: data.tongue_str,
           cover: {
@@ -39,7 +41,9 @@ export function analysisHealthMethod(model: AnalysisHealthModel) {
             down: getUrl(data.tongue_under_origin_path)!,
           },
         };
-      if (data.face_str)
+
+      if (data.face_str.startsWith(`图像检测失败`)) error.tongue = data.face_str.replace('图像', '面象');
+      else if (data.face_str)
         result.face = {
           result: data.face_str,
           cover: {
@@ -47,6 +51,11 @@ export function analysisHealthMethod(model: AnalysisHealthModel) {
           },
         };
 
+      if (Object.keys(error).length > 0) {
+        error.message = [error.tongue, error.face].filter(Boolean).join('\n');
+        throw error;
+      }
+
       return { model, result } as { model: AnalysisHealthModel; result: AnalysisHealthReportModel };
     },
   });

+ 2 - 1
src/request/api/chat.ts

@@ -9,9 +9,10 @@ export function guideChatMethod(message: string, options?: { session_id?: string
         sseTransform(line) {
           const [_, event, content] = line.match(/([^:]*):\s*(.*)/) ?? [];
           const data = JSON.parse(content.trim());
+          if (data.error) return { event: 'error', data: { message: data.error } };
           if (data?.end) return [data.content ? { event, data } : void 0, { event: 'over' }].filter(Boolean);
           return { event, data };
-        }
+        },
       },
     },
   );

+ 7 - 0
src/request/model/analysis-health.model.ts

@@ -15,3 +15,10 @@ export interface AnalysisHealthReportModel {
     };
   };
 }
+
+export interface AnalysisHealthReportError {
+  tongue?: string;
+  face?: string;
+
+  message?: string;
+}