Electron ipcMain how to gracefully handle throwing an error

5.7k Views Asked by At

In Electron if I throw an error anywhere on the backend it goes to a custom window. Trying to find a way to catch that to push to a custom area in my app I've found that I can detect the process with process.on('uncaughtException'). However I'm stuck trying to run a sender to send either the error or the report. What I've tried:

ipcMain.on('main', async (e, data) => {
  try {
    await someModule(data)
    process.on('uncaughtException', err => e.sender.send('error', err.message))
    return e.sender.send('audit', 'No issues found')
  } catch (err) {
    console.log(err)
  }
})

module.js:

module.export = data => {
  throw Error('this is a test')
}

In the above I'm sending both get both errorandaudit` to renderer. I've researched for a way to pass 'uncaughtException' to a ternary but I'm not able to find any docs on how to condition for 'uncaughtException' but I did try:

process.on('uncaughtException', err => {
  if (err) return e.sender.send('error', err.message)
  return e.sender.send('audit', 'test complete')
})

and the above only works if an error is present, research:

In Electron how can I intercept the error to pass it to renderer from main without throwing the default error window?

1

There are 1 best solutions below

5
On BEST ANSWER

If you use ipcMain.handle you will be able to handle errors in the renderer process like this

// Main process
ipcMain.handle('my-invokable-ipc', async (event, data) => {
  await someModule(data)
  return 'No issues found'
})

// Renderer process
async () => {
  try {
    const result = await ipcRenderer.invoke('my-invokable-ipc', data)
    console.log(result) // 'No issues found' if someModule did not throw an error
  } catch (err) {
    // you can handle someModule errors here
  }
}

Update: An issue with this approach is that the error emitted to the renderer process is serialized and it gets printed even though it's handled with a try/catch.

To fix this, you can also handle the errors in the main process

// Main process
ipcMain.handle('my-invokable-ipc', async (event, data) => {
  try {
    await someModule(data)
    return 'No issues found'
  } catch (err) {
    // handle someModule errors and notify renderer process
    // return err.message or any other way you see fit
  }
})

// Renderer process
async () => {
  const result = await ipcRenderer.invoke('my-invokable-ipc', data)
  console.log(result) // 'No issues found' if someModule did not throw an error
}