是否有可能在电子主过程中捕获渲染器过程的异常?

Edw*_*ard 6 javascript exception-handling exception electron

我正在使用Electrons Quick Start Projekt(Commit dbef48ee7d072a38724ecfa57601e39d36e9714e)来测试异常.

index.html我从改变所需要的模块的名称renderer.jsrendererXXX.js.

require('./renderer.js')
Run Code Online (Sandbox Code Playgroud)

这导致了预期的Exeption(在该窗口的devtools中可见):

Uncaught Error: Cannot find module './rendererXXX.js'
Run Code Online (Sandbox Code Playgroud)

现在,如果main-process(请参阅main.js)知道一个渲染器进程失败,那将会很好.因此,我将窗口的instatiation包装成try-catch-block

try {
  app.on('ready', createWindow)
} catch (e) {
  console.log("Exception caught: " + e.message);
} finally {
  // nothing yet
}
Run Code Online (Sandbox Code Playgroud)

但我意识到,异常不会转发到主进程.那么处理渲染器进程异常的典型方法是什么?有没有办法从主进程处理它们?

编辑:

我还包装了加载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);
  }
Run Code Online (Sandbox Code Playgroud)

Tea*_*eak 14

电子窗口在它们自己的过程中呈现.因此,主进程和渲染进程之间几乎没有任何通信.您可以做的最好的事情是在渲染过程中捕获错误,并使用Electrons IPC模块将它们传递回主进程.

在渲染过程中:

var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
    ipc.send('errorInWindow', error);
};
Run Code Online (Sandbox Code Playgroud)

在您的主要流程中:

var ipc = require('electron').ipcMain;

ipc.on('errorInWindow', function(event, data){
    console.log(data)
});
Run Code Online (Sandbox Code Playgroud)

此外,您的主进程可以直接在窗口(或窗口webContents)上监视有限的事件集:

window.on('unresponsive', function() {
    console.log('window crashed');
});
Run Code Online (Sandbox Code Playgroud)

...

window.webContents.on('did-fail-load', function() {
    console.log('window failed load');
});
Run Code Online (Sandbox Code Playgroud)


小智 5

我有一个类似的问题,我想将错误记录到主进程的文件中.这是柚木已经提供的答案的补充:

var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
    ipc.send('errorInWindow', error);
};
Run Code Online (Sandbox Code Playgroud)

会工作.请记住,onerror回调传递5个参数,其中最后一个是实际的Error对象.

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror

但是,由于消息在通过IPC发送时被序列化,因此无法完全传递Error对象,因为默认情况下它不会正确序列化.因此,如果您需要更多错误详细信息(例如堆栈跟踪等),则需要在发送数据之前对其进行按摩.

我使用以下是不可能使用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));
}
Run Code Online (Sandbox Code Playgroud)

然后在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);
})
Run Code Online (Sandbox Code Playgroud)