Skip to content

src: fix abort-on-uncaught-exception

This PR fixes 0af4c9ea so that node aborts at the right time when throwing an error and using --abort-on-uncaught-exception.

Basically, it wraps most node internal callbacks with:

if (!domain || domain.emittingTopLevelError)
  runCallback();
else {
  try {
    runCallback();
  } catch (err) {
    process._fatalException(err);
  }
}

so that V8 can abort properly in Isolate::Throw if --abort-on-uncaught-exception was passed on the command line, and domain can handle the error if one is active and not already in the top level domain's error handler.

It also reverts 921f2de6 partially: node::FatalException does not abort anymore because at that time, it's already too late.

It adds process._forceTickDone, which is really a hack to allow test-next-tick-error-spin.js to pass and start the discussion. It's here to basically avoid an infinite recursion when throwing in a domain from a nextTick callback, and queuing the same callback on the next tick from the domain's error handler.

This change is an alternative approach to #3036 for fixing #3035 (closed).

Fixes #3035 (closed).

/cc @nodejs/post-mortem

Merge request reports

Loading