是否有可能在电子主进程中捕获渲染进程的异常?
Is it possible to catch exceptions of renderer processes in electrons main process?
我正在使用 Electrons Quick Start Projekt(提交 dbef48ee7d072a38724ecfa57601e39d36e9714e)来测试异常。
在 index.html
中,我将所需模块的名称从 renderer.js
更改为 rendererXXX.js
。
require('./renderer.js')
这会导致预期的异常(在 window 的开发工具中可见):
Uncaught Error: Cannot find module './rendererXXX.js'
现在,如果主进程(参见 main.js
)知道一个渲染进程失败,那就太好了。因此,我将 window 的实例包装到一个 try-catch-block
try {
app.on('ready', createWindow)
} catch (e) {
console.log("Exception caught: " + e.message);
} finally {
// nothing yet
}
但我意识到,异常是而不是转发到主进程。那么处理渲染器进程异常的典型方法是什么——有没有办法从主进程中处理它们?
编辑:
我也将加载 index.html
的行包装到 try-catch 中,但我仍然无法处理错误:
try {
// and load the index.html of the app.
mainWindow.loadURL(`file://${__dirname}/index.html`)
} catch (e) {
console.log("Exception caught in 'createWindow': " + e.message);
}
Electron windows 在它们自己的进程中呈现。因此,主进程和渲染进程之间几乎没有通信。你能做的最好的事情就是在渲染过程中捕获错误并使用 Electrons IPC 模块将它们传递回你的主进程。
在您的渲染过程中:
var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
ipc.send('errorInWindow', error);
};
在你的主进程中:
var ipc = require('electron').ipcMain;
ipc.on('errorInWindow', function(event, data){
console.log(data)
});
此外,您的主进程可以直接在 window(或 windows webContents
)上监视一组有限的事件:
window.on('unresponsive', function() {
console.log('window crashed');
});
...
window.webContents.on('did-fail-load', function() {
console.log('window failed load');
});
我有一个类似的问题,我想将错误记录到主进程的文件中。这是对 Teak 已经提供的答案的补充:
var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
ipc.send('errorInWindow', error);
};
会起作用。请记住,onerror
回调传递了 5 个参数,其中最后一个是实际的 Error 对象。
https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror
但是,由于消息在通过 IPC 发送时被序列化,因此无法完全传递 Error 对象,因为默认情况下它不会正确序列化。因此,如果您需要更多错误详细信息(例如堆栈跟踪等),则需要在发送数据之前对数据进行处理。
我使用了以下 Is it not possible to stringify an Error using JSON.stringify? 的一些想法,最终结果是:
var objFromError = function(err, filter, space) {
var plainObject = {};
Object.getOwnPropertyNames(err).forEach(function(key) {
plainObject[key] = err[key];
});
return plainObject;
};
window.onerror = function (msg, url, lineNo, columnNo, error) {
ipcRenderer.send('asynchronous-windowerr', 'main', objFromError(error));
}
然后在main.js:
ipcMain.on('asynchronous-windowerr', function(event, source, err) {
var str = source + ': ';
if(err != null) {
if(err.stack != null) {
str += err.stack;
} else if(err.message != null) {
str += err.message;
}
}
loggerr.appendLogFile(errLogFile, 'err', str);
})
我正在使用 Electrons Quick Start Projekt(提交 dbef48ee7d072a38724ecfa57601e39d36e9714e)来测试异常。
在 index.html
中,我将所需模块的名称从 renderer.js
更改为 rendererXXX.js
。
require('./renderer.js')
这会导致预期的异常(在 window 的开发工具中可见):
Uncaught Error: Cannot find module './rendererXXX.js'
现在,如果主进程(参见 main.js
)知道一个渲染进程失败,那就太好了。因此,我将 window 的实例包装到一个 try-catch-block
try {
app.on('ready', createWindow)
} catch (e) {
console.log("Exception caught: " + e.message);
} finally {
// nothing yet
}
但我意识到,异常是而不是转发到主进程。那么处理渲染器进程异常的典型方法是什么——有没有办法从主进程中处理它们?
编辑:
我也将加载 index.html
的行包装到 try-catch 中,但我仍然无法处理错误:
try {
// and load the index.html of the app.
mainWindow.loadURL(`file://${__dirname}/index.html`)
} catch (e) {
console.log("Exception caught in 'createWindow': " + e.message);
}
Electron windows 在它们自己的进程中呈现。因此,主进程和渲染进程之间几乎没有通信。你能做的最好的事情就是在渲染过程中捕获错误并使用 Electrons IPC 模块将它们传递回你的主进程。
在您的渲染过程中:
var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
ipc.send('errorInWindow', error);
};
在你的主进程中:
var ipc = require('electron').ipcMain;
ipc.on('errorInWindow', function(event, data){
console.log(data)
});
此外,您的主进程可以直接在 window(或 windows webContents
)上监视一组有限的事件:
window.on('unresponsive', function() {
console.log('window crashed');
});
...
window.webContents.on('did-fail-load', function() {
console.log('window failed load');
});
我有一个类似的问题,我想将错误记录到主进程的文件中。这是对 Teak 已经提供的答案的补充:
var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
ipc.send('errorInWindow', error);
};
会起作用。请记住,onerror
回调传递了 5 个参数,其中最后一个是实际的 Error 对象。
https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror
但是,由于消息在通过 IPC 发送时被序列化,因此无法完全传递 Error 对象,因为默认情况下它不会正确序列化。因此,如果您需要更多错误详细信息(例如堆栈跟踪等),则需要在发送数据之前对数据进行处理。
我使用了以下 Is it not possible to stringify an Error using JSON.stringify? 的一些想法,最终结果是:
var objFromError = function(err, filter, space) {
var plainObject = {};
Object.getOwnPropertyNames(err).forEach(function(key) {
plainObject[key] = err[key];
});
return plainObject;
};
window.onerror = function (msg, url, lineNo, columnNo, error) {
ipcRenderer.send('asynchronous-windowerr', 'main', objFromError(error));
}
然后在main.js:
ipcMain.on('asynchronous-windowerr', function(event, source, err) {
var str = source + ': ';
if(err != null) {
if(err.stack != null) {
str += err.stack;
} else if(err.message != null) {
str += err.message;
}
}
loggerr.appendLogFile(errLogFile, 'err', str);
})