You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:50:46