Javascript 是否可以捕获主进程中渲染器进程的异常?

Javascript 是否可以捕获主进程中渲染器进程的异常?,javascript,exception,exception-handling,electron,Javascript,Exception,Exception Handling,Electron,我正在使用(Commit dbef48ee7d072a38724ecfa57601e39d36e9714e)测试异常 在index.html中,我将所需模块的名称从renderer.js更改为rendererXXX.js require('./renderer.js') 这将导致预期的Exeption(在该窗口的devtools中可见): 现在,如果主进程(参见main.js)知道一个渲染器进程失败,那就好了。因此,我把窗户的安装包成了一个试扣块 try { app.on('ready',

我正在使用(Commit dbef48ee7d072a38724ecfa57601e39d36e9714e)测试异常

index.html
中,我将所需模块的名称从
renderer.js
更改为
rendererXXX.js

require('./renderer.js')
这将导致预期的Exeption(在该窗口的devtools中可见):

现在,如果主进程(参见
main.js
)知道一个渲染器进程失败,那就好了。因此,我把窗户的安装包成了一个试扣块

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);
  }

电子窗口在其自己的过程中渲染。因此,主进程和渲染进程之间几乎没有通信。您所能做的最好的事情就是捕获渲染过程中的错误,并使用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)
});
此外,您的主进程还可以直接在窗口(或windows
WebContent
)上监视有限的事件集:


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

var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
    ipc.send('errorInWindow', error);
};
会有用的。请记住,
onerror
回调传递5个参数,其中最后一个是实际的错误对象

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

我使用了以下一些想法,最终结果是:

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);
})

尝试将Try catch放在
createWindow
事件处理程序函数中。@Bergi:这也不起作用-我仍然无法在主进程中看到异常。(请参阅我的更新问题)是否有理由将
ipc.send
包装到
窗口中。OneError()
而不是
try…catch
?任何JS错误都可以使用
OneError
。但是如果需要,您可以
尝试捕获特定的内容('Unresponse'…
转到主窗口?有没有办法确定IPC消息是通过哪个窗口发送的?是的,它会转到主进程。
事件。发送方
提供发送方窗口的
WebContent
。我如何使用WebContent对象关闭发送IPC的渲染器进程?我的主进程它是可能是
主窗口
首选项窗口
。。。
var ipc = require('electron').ipcRenderer;
window.onerror = function(error, url, line) {
    ipc.send('errorInWindow', error);
};
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));
}
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);
})