Electron主进程中SQLite3操作的错误捕获问题求解
Electron主进程中SQLite3错误捕获方案
问题原因
你的try-catch无法生效,核心原因是SQLite3的db.run是异步API,同步try-catch只能捕获当前执行栈内的同步错误,无法捕获异步操作抛出的异常。同时Electron主进程默认会将未捕获的异常以系统级错误窗口形式弹出。
解决方案
1. 用Promise/async-await处理异步数据库操作
将db.run转换为返回Promise的函数,配合async-await即可用try-catch捕获错误:
// main.js 修改后的代码 const { ipcMain } = require('electron'); const sqlite3 = require('sqlite3').verbose(); const util = require('util'); // 初始化数据库连接 const db = new sqlite3.Database('./your-db-file.db'); // 把db.run转为支持Promise的版本(绑定db上下文) const dbRun = util.promisify(db.run.bind(db)); ipcMain.handle("delete-main-menu-item", async (event, id) => { try { await dbRun("DELETE FROM projects_ErrOrNaMe WHERE id=?", [id]); } catch (error) { console.log('捕获到数据库错误:', error); // 可选:将错误抛出给渲染进程处理 throw error; } });
2. 渲染进程侧捕获返回的错误
在渲染进程调用时,同样可以用try-catch处理主进程抛出的错误:
// 渲染进程代码 try { await window.api.deleteMainMenuItem(目标ID); } catch (error) { console.error('删除菜单操作失败:', error); // 这里可以给用户展示友好提示 }
3. 全局拦截Electron系统错误弹窗
为了避免未捕获的异常弹出系统级错误窗口,在主进程中添加全局异常监听:
// main.js 全局错误处理 const { app } = require('electron'); // 处理未捕获的同步异常 app.on('uncaughtException', (error) => { console.error('主进程未捕获异常:', error); // 可选:写入错误日志、重启应用等自定义逻辑 }); // 处理未处理的Promise拒绝 process.on('unhandledRejection', (reason, promise) => { console.error('主进程未处理的Promise拒绝:', reason); });
补充说明
如果坚持使用回调式的db.run,也可以通过回调函数捕获错误:
ipcMain.handle("delete-main-menu-item", (event, id) => { return new Promise((resolve, reject) => { db.run("DELETE FROM projects_ErrOrNaMe WHERE id=?", [id], (error) => { if (error) { console.log('捕获到错误:', error); reject(error); } else { resolve(); } }); }); });
内容的提问来源于stack exchange,提问作者Shoshin
相关产品推荐
相关产品推荐

