如何阻止浏览器窗口在执行JavaScript中出现单个错误后中断?



我正在使用executeJavaScript方法通过Electron控制页面。但是,我注意到BrowserWindow实例在发生一个错误后基本上变得无响应。除了将每一行代码放在try/catch块中之外,是否可以禁用此功能?

具体来说,我希望BrowserWindow继续执行未来的代码,尽管在以前的请求中遇到了错误。例如,在下面的代码中,我希望控制台成功输出I'm not being executed

const {BrowserWindow, app} = require('electron')
async function main() {
var win = new BrowserWindow({webPreferences: {nodeIntegration: false} });
win.openDevTools();
win.loadURL('https://www.homedepot.com');
await sleep(10000); //letting page load
await win.webContents.executeJavaScript('console.log("Im being executed")')
await sleep(2000);//break
await win.webContents.executeJavaScript('undefinedVar.causeError()')
await sleep(2000);//break
await win.webContents.executeJavaScript('console.log("Im not being executed")')
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
app.on('ready', main)

首先,我不相信BrowserWindow在执行损坏的代码后没有响应。您仍然可以移动它并最大化它,等等。只是executeJavaScript返回的Promise卡在挂起状态,因此您永远不会完成await它。

这实际上是通过这个拉取请求在 Electron 6 中修复的。在 Electron 6 中,您可以执行以下操作:

var win;
async function createWindow2() {
win = new BrowserWindow();
win.openDevTools();
await win.loadURL('https://www.google.com');
await executeSafely('console.log("Im being executed")');
await executeSafely('undefinedVar.causeError()');
await executeSafely('console.log("Im not being executed")');
}
async function executeSafely(code) {
try {
await win.webContents.executeJavaScript(code);
}
catch (e) { } // assuming you want to ignore errors
}

如果升级Electron不适合您,那么您可以创建一个函数,将代码包装在Promisetry/catch中,具体取决于您的需要。

如果您只想忽略所有错误,那么将执行的代码包装在try/catch中就足够了。否则,您可以包装在Promise中,这应该会导致executeJavaScript返回的Promise被拒绝。例:

async function main() {
var win = new BrowserWindow();
win.openDevTools();
win.loadURL('https://www.google.com');
await sleep(5000);
await win.webContents.executeJavaScript(makeSafe('console.log("Im being executed")'));
await win.webContents.executeJavaScript(makeSafe('undefinedVar.causeError()'));
await win.webContents.executeJavaScript(makeSafe('console.log("Im not being executed")'));
}
function makeSafe(code) {
return "try{" + code + "}catch{}";
}

最新更新