Skip to content

Commit d60b1f4

Browse files
committed
refactor: standardize error handling across codebase with toAppError utility
- Replace handleError with toAppError in IPC handlers (debug, llm, lsp, mcp, resources) - Rename logAndThrowError to logAndThrowError for consistency in LLM service - Update error handling in LSP installer and manager modules - Standardize error handling in security modules (fileWatcher, secureFile, secureTerminal, securityModule) - Refactor StreamingService error handling with improved error type conversion - Update MCP client, config loader, and manager error handling patterns - Standardize error handling in update service and agent services - Improve error handling in tool providers and registry - Update terminal, workspace, and completion service error handling - Refactor shared error handler utility with better type safety - Update error handler tests to reflect new toAppError API - Consolidate error handling patterns across main and renderer processes for better maintainability
1 parent 68171b2 commit d60b1f4

32 files changed

+692
-516
lines changed

src/main/ipc/debug.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44

55
import { ipcMain } from 'electron'
6-
import { handleError } from '@shared/utils/errorHandler'
6+
import { toAppError } from '@shared/utils/errorHandler'
77
import { debugService } from '../services/debugger'
88
import { getAdapterInfo, builtinAdapters } from '../services/debugger/adapters'
99
import type { DebugConfig } from '../services/debugger'
@@ -31,7 +31,7 @@ export function registerDebugHandlers() {
3131
const sessionId = await debugService.createSession(config)
3232
return { success: true, sessionId }
3333
} catch (err) {
34-
return { success: false, error: handleError(err).message }
34+
return { success: false, error: toAppError(err).message }
3535
}
3636
})
3737

@@ -41,7 +41,7 @@ export function registerDebugHandlers() {
4141
await debugService.launch(sessionId)
4242
return { success: true }
4343
} catch (err) {
44-
return { success: false, error: handleError(err).message }
44+
return { success: false, error: toAppError(err).message }
4545
}
4646
})
4747

@@ -51,7 +51,7 @@ export function registerDebugHandlers() {
5151
await debugService.attach(sessionId)
5252
return { success: true }
5353
} catch (err) {
54-
return { success: false, error: handleError(err).message }
54+
return { success: false, error: toAppError(err).message }
5555
}
5656
})
5757

@@ -61,7 +61,7 @@ export function registerDebugHandlers() {
6161
await debugService.configurationDone(sessionId)
6262
return { success: true }
6363
} catch (err) {
64-
return { success: false, error: handleError(err).message }
64+
return { success: false, error: toAppError(err).message }
6565
}
6666
})
6767

@@ -71,7 +71,7 @@ export function registerDebugHandlers() {
7171
await debugService.stop(sessionId)
7272
return { success: true }
7373
} catch (err) {
74-
return { success: false, error: handleError(err).message }
74+
return { success: false, error: toAppError(err).message }
7575
}
7676
})
7777

@@ -81,7 +81,7 @@ export function registerDebugHandlers() {
8181
await debugService.continue(sessionId)
8282
return { success: true }
8383
} catch (err) {
84-
return { success: false, error: handleError(err).message }
84+
return { success: false, error: toAppError(err).message }
8585
}
8686
})
8787

@@ -91,7 +91,7 @@ export function registerDebugHandlers() {
9191
await debugService.stepOver(sessionId)
9292
return { success: true }
9393
} catch (err) {
94-
return { success: false, error: handleError(err).message }
94+
return { success: false, error: toAppError(err).message }
9595
}
9696
})
9797

@@ -101,7 +101,7 @@ export function registerDebugHandlers() {
101101
await debugService.stepInto(sessionId)
102102
return { success: true }
103103
} catch (err) {
104-
return { success: false, error: handleError(err).message }
104+
return { success: false, error: toAppError(err).message }
105105
}
106106
})
107107

@@ -111,7 +111,7 @@ export function registerDebugHandlers() {
111111
await debugService.stepOut(sessionId)
112112
return { success: true }
113113
} catch (err) {
114-
return { success: false, error: handleError(err).message }
114+
return { success: false, error: toAppError(err).message }
115115
}
116116
})
117117

@@ -121,7 +121,7 @@ export function registerDebugHandlers() {
121121
await debugService.pause(sessionId)
122122
return { success: true }
123123
} catch (err) {
124-
return { success: false, error: handleError(err).message }
124+
return { success: false, error: toAppError(err).message }
125125
}
126126
})
127127

@@ -131,7 +131,7 @@ export function registerDebugHandlers() {
131131
const result = await debugService.setBreakpoints(sessionId, file, breakpoints)
132132
return { success: true, breakpoints: result }
133133
} catch (err) {
134-
return { success: false, error: handleError(err).message }
134+
return { success: false, error: toAppError(err).message }
135135
}
136136
})
137137

@@ -141,7 +141,7 @@ export function registerDebugHandlers() {
141141
const frames = await debugService.getStackTrace(sessionId, threadId)
142142
return { success: true, frames }
143143
} catch (err) {
144-
return { success: false, error: handleError(err).message }
144+
return { success: false, error: toAppError(err).message }
145145
}
146146
})
147147

@@ -151,7 +151,7 @@ export function registerDebugHandlers() {
151151
const scopes = await debugService.getScopes(sessionId, frameId)
152152
return { success: true, scopes }
153153
} catch (err) {
154-
return { success: false, error: handleError(err).message }
154+
return { success: false, error: toAppError(err).message }
155155
}
156156
})
157157

@@ -161,7 +161,7 @@ export function registerDebugHandlers() {
161161
const variables = await debugService.getVariables(sessionId, variablesReference)
162162
return { success: true, variables }
163163
} catch (err) {
164-
return { success: false, error: handleError(err).message }
164+
return { success: false, error: toAppError(err).message }
165165
}
166166
})
167167

@@ -171,7 +171,7 @@ export function registerDebugHandlers() {
171171
const result = await debugService.evaluate(sessionId, expression, frameId)
172172
return { success: true, result }
173173
} catch (err) {
174-
return { success: false, error: handleError(err).message }
174+
return { success: false, error: toAppError(err).message }
175175
}
176176
})
177177

@@ -191,7 +191,7 @@ export function registerDebugHandlers() {
191191
const threads = await debugService.getThreads(sessionId)
192192
return { success: true, threads }
193193
} catch (err) {
194-
return { success: false, error: handleError(err).message }
194+
return { success: false, error: toAppError(err).message }
195195
}
196196
})
197197

src/main/ipc/llm.ts

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,18 @@ function getOrCreateCompactionService(webContentsId: number, window: BrowserWind
6464
}
6565

6666
/**
67-
* 统一错误处理
67+
* 统一错误处理 - 记录日志并抛出 LLMError
6868
*/
69-
function handleError(error: unknown, operation: string) {
70-
if (error instanceof LLMError) {
71-
logger.ipc.error(`[LLMService] ${operation} error:`, {
72-
code: error.code,
73-
message: error.message,
74-
retryable: error.retryable,
75-
})
76-
throw error
77-
}
78-
79-
const err = error as { message?: string }
80-
logger.ipc.error(`[LLMService] ${operation} error:`, error)
81-
throw new Error(err.message || `${operation} failed`)
69+
function logAndThrowError(error: unknown, operation: string): never {
70+
const llmError = error instanceof LLMError ? error : LLMError.fromError(error)
71+
72+
logger.ipc.error(`[LLMService] ${operation} failed:`, {
73+
code: llmError.code,
74+
message: llmError.message,
75+
retryable: llmError.retryable,
76+
})
77+
78+
throw llmError
8279
}
8380

8481
export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null) {
@@ -94,8 +91,16 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
9491

9592
try {
9693
await service.sendMessage(params)
94+
// 流式响应通过事件发送,不需要返回值
9795
} catch (error) {
98-
handleError(error, 'Send message')
96+
// 流式错误已通过 llm:error 事件发送到前端
97+
// 这里只记录日志,不抛出,避免 IPC 包装错误消息
98+
const llmError = error instanceof LLMError ? error : LLMError.fromError(error)
99+
logger.ipc.error('[LLMService] Send message failed:', {
100+
code: llmError.code,
101+
message: llmError.message,
102+
retryable: llmError.retryable,
103+
})
99104
}
100105
})
101106

@@ -146,7 +151,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
146151
metadata: response.metadata,
147152
}
148153
} catch (error) {
149-
handleError(error, 'Code analysis')
154+
logAndThrowError(error, 'Code analysis')
150155
}
151156
})
152157

@@ -168,7 +173,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
168173
metadata: response.metadata,
169174
}
170175
} catch (error) {
171-
handleError(error, 'Code analysis stream')
176+
logAndThrowError(error, 'Code analysis stream')
172177
}
173178
})
174179

@@ -190,7 +195,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
190195
metadata: response.metadata,
191196
}
192197
} catch (error) {
193-
handleError(error, 'Refactoring suggestion')
198+
logAndThrowError(error, 'Refactoring suggestion')
194199
}
195200
})
196201

@@ -212,7 +217,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
212217
metadata: response.metadata,
213218
}
214219
} catch (error) {
215-
handleError(error, 'Fix suggestion')
220+
logAndThrowError(error, 'Fix suggestion')
216221
}
217222
})
218223

@@ -234,7 +239,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
234239
metadata: response.metadata,
235240
}
236241
} catch (error) {
237-
handleError(error, 'Test generation')
242+
logAndThrowError(error, 'Test generation')
238243
}
239244
})
240245

@@ -255,7 +260,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
255260
usage: convertTokenUsage(response.usage),
256261
}
257262
} catch (error) {
258-
handleError(error, 'Text embedding')
263+
logAndThrowError(error, 'Text embedding')
259264
}
260265
})
261266

@@ -272,7 +277,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
272277
usage: convertTokenUsage(response.usage),
273278
}
274279
} catch (error) {
275-
handleError(error, 'Batch embedding')
280+
logAndThrowError(error, 'Batch embedding')
276281
}
277282
})
278283

@@ -291,7 +296,7 @@ export function registerLLMHandlers(_getMainWindow: () => BrowserWindow | null)
291296
)
292297
return result
293298
} catch (error) {
294-
handleError(error, 'Similarity search')
299+
logAndThrowError(error, 'Similarity search')
295300
}
296301
})
297302
}

src/main/ipc/lsp.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44

55
import { logger } from '@shared/utils/Logger'
6-
import { handleError } from '@shared/utils/errorHandler'
6+
import { toAppError } from '@shared/utils/errorHandler'
77
import { ipcMain } from 'electron'
88
import { lspManager, LanguageId } from '../lspManager'
99
import { EXTENSION_TO_LANGUAGE } from '@shared/languages'
@@ -425,7 +425,7 @@ export function registerLspHandlers(mainStore?: any): void {
425425
try {
426426
return await installServer(serverType)
427427
} catch (err) {
428-
return { success: false, error: handleError(err).message }
428+
return { success: false, error: toAppError(err).message }
429429
}
430430
})
431431

@@ -434,7 +434,7 @@ export function registerLspHandlers(mainStore?: any): void {
434434
await installBasicServers()
435435
return { success: true }
436436
} catch (err) {
437-
return { success: false, error: handleError(err).message }
437+
return { success: false, error: toAppError(err).message }
438438
}
439439
})
440440

0 commit comments

Comments
 (0)