From b4c55ce2330646722b3a887fc59cb1734dfd131a Mon Sep 17 00:00:00 2001 From: spark Date: Mon, 10 Feb 2025 17:46:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=E5=A2=9E=E5=8A=A0=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=94=99=E8=AF=AF=E6=8D=95=E8=8E=B7=E5=92=8C=E5=90=8E?= =?UTF-8?q?=E7=AB=AFpanic=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在前端 App.vue、settings.vue 和 stock.vue 中添加 window.onerror 事件处理器,捕获前端错误并发送给后端 - 在后端 app.go 和 openai_api.go 中添加 panic 处理逻辑,捕获并记录 panic错误 - 在 main.go 中添加 PanicHandler 函数,用于捕获和处理全局 panic --- app.go | 8 ++++++++ backend/data/openai_api.go | 28 +++++++++++++++++++++++----- frontend/src/App.vue | 13 +++++++++++++ frontend/src/components/settings.vue | 14 ++++++++++++++ frontend/src/components/stock.vue | 14 ++++++++++++-- main.go | 10 ++++++++++ 6 files changed, 80 insertions(+), 7 deletions(-) diff --git a/app.go b/app.go index e589f58..50ce81b 100644 --- a/app.go +++ b/app.go @@ -41,6 +41,10 @@ func NewApp() *App { // startup is called at application startup func (a *App) startup(ctx context.Context) { + defer PanicHandler() + runtime.EventsOn(ctx, "frontendError", func(optionalData ...interface{}) { + logger.SugaredLogger.Errorf("Frontend error: %v\n", optionalData) + }) logger.SugaredLogger.Infof("Version:%s", Version) // Perform your setup here a.ctx = ctx @@ -86,6 +90,8 @@ func checkUpdate(a *App) { // domReady is called after front-end resources have been loaded func (a *App) domReady(ctx context.Context) { + defer PanicHandler() + // Add your action here //定时更新数据 go func() { @@ -321,6 +327,7 @@ func addStockFollowData(follow data.FollowedStock, stockData *data.StockInfo) { // either by clicking the window close button or calling runtime.Quit. // Returning true will cause the application to continue, false will continue shutdown as normal. func (a *App) beforeClose(ctx context.Context) (prevent bool) { + defer PanicHandler() dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ Type: runtime.QuestionDialog, @@ -344,6 +351,7 @@ func (a *App) beforeClose(ctx context.Context) (prevent bool) { // shutdown is called at application termination func (a *App) shutdown(ctx context.Context) { + defer PanicHandler() // Perform your teardown here systray.Quit() } diff --git a/backend/data/openai_api.go b/backend/data/openai_api.go index 11583e5..8124115 100644 --- a/backend/data/openai_api.go +++ b/backend/data/openai_api.go @@ -76,7 +76,19 @@ type AiResponse struct { func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { ch := make(chan string, 512) + + defer func() { + if err := recover(); err != nil { + logger.SugaredLogger.Error("NewChatStream panic", err) + } + }() + go func() { + defer func() { + if err := recover(); err != nil { + logger.SugaredLogger.Error("NewChatStream goroutine panic", err) + } + }() defer close(ch) msg := []map[string]interface{}{ { @@ -174,7 +186,7 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { client.SetBaseURL(o.BaseUrl) client.SetHeader("Authorization", "Bearer "+o.ApiKey) client.SetHeader("Content-Type", "application/json") - client.SetRetryCount(3) + //client.SetRetryCount(3) if o.TimeOut <= 0 { o.TimeOut = 300 } @@ -190,14 +202,15 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { }). Post("/chat/completions") - defer resp.RawBody().Close() + body := resp.RawBody() + defer body.Close() if err != nil { logger.SugaredLogger.Infof("Stream error : %s", err.Error()) ch <- err.Error() return } - scanner := bufio.NewScanner(resp.RawBody()) + scanner := bufio.NewScanner(body) for scanner.Scan() { line := scanner.Text() logger.SugaredLogger.Infof("Received data: %s", line) @@ -232,8 +245,13 @@ func (o OpenAi) NewChatStream(stock, stockCode string) <-chan string { } } } else { - logger.SugaredLogger.Infof("Stream data error : %s", err.Error()) - ch <- err.Error() + if err != nil { + logger.SugaredLogger.Infof("Stream data error : %s", err.Error()) + ch <- err.Error() + } else { + logger.SugaredLogger.Infof("Stream data error : %s", data) + ch <- data + } } } else { ch <- line diff --git a/frontend/src/App.vue b/frontend/src/App.vue index ad4b884..cbb7fd9 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,6 +1,7 @@