electron开发的软件,捕获软件异常,对出错原因进行记录或者进行其他逻辑操作。
创建BrowserWindow后,添加如下代码
mainWin.webContents.on("crashed", async (e, killed) => {
let result = await dialog.showMessageBox({
type: "error",
title: "应用程序崩溃",
message: "当前程序发生异常,是否要重新加载应用程序?",
buttons: ["是", "否"],
})
if (result.response == 0){
mainWin.webContents.reload()
} else {
app.quit()
console.log('系统奔溃,可在此进行日志收集,将奔溃原因写入日志文件')
}
})
或者
app.on('render-process-gone', async (e, w, d) => {
const _path ='/home/logs/error.log'
if (!fs.existsSync(_path)) {
fs.writeFileSync(_path, `[${getFormatDate('-', '', '-', '_')}] 系统出错日志
·clean-exit - 以零为退出代码退出的进程
·abnormal-exit - 以非零退出代码退出的进程
·killed - 进程发送一个SIGTERM,否则是被外部杀死的。
·crashed - 进程崩溃
·oom - 进程内存不足
·launch-failed - 进程从未成功启动
·integrity-failure - 窗口代码完整性检查失败
\n`, { encoding: 'utf-8' })
}
if(d.reason == "crashed" || d.reason == "oom") { // 进程崩溃 / 进程内存不足
let result = await dialog.showMessageBox({
type: "error",
title: "应用程序崩溃",
message: "当前程序发生异常,是否要重新加载应用程序?",
buttons: ["是", "否"],
})
const msg = `[${new Date()}] 渲染进程被杀死${d.reason}`
if (result.response == 0){
fs.appendFileSync(_path, `${msg}重新加载软件\n`)
mainWin.webContents.reload()
} else {
fs.appendFileSync(_path, `${msg}\n`)
app.quit()
}
} else {
fs.appendFileSync(_path, `[${new Date()}] 渲染进程被杀死${d.reason}\n`)
}
})