Skip to content

Commit

Permalink
src: allow fatal exceptions to be enhanced
Browse files Browse the repository at this point in the history
This commit allows fatal exceptions to be enhanced so that
exceptions thrown from an unhandledException handler have
the stack attached properly.

PR-URL: #28562
Fixes: #28550
Reviewed-By: Joyee Cheung <[email protected]>
Reviewed-By: Rich Trott <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
  • Loading branch information
cjihrig committed Jul 7, 2019
1 parent 7cf6f9e commit 36fdf1a
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/node_errors.cc
Original file line number Diff line number Diff line change
Expand Up @@ -448,10 +448,11 @@ TryCatchScope::~TryCatchScope() {
HandleScope scope(env_->isolate());
Local<v8::Value> exception = Exception();
Local<v8::Message> message = Message();
EnhanceFatalException enhance = CanContinue() ?
EnhanceFatalException::kEnhance : EnhanceFatalException::kDontEnhance;
if (message.IsEmpty())
message = Exception::CreateMessage(env_->isolate(), exception);
ReportFatalException(
env_, exception, message, EnhanceFatalException::kDontEnhance);
ReportFatalException(env_, exception, message, enhance);
env_->Exit(7);
}
}
Expand Down
28 changes: 28 additions & 0 deletions test/parallel/test-unhandled-exception-rethrow-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';
require('../common');

if (process.argv[2] === 'child') {
process.on('uncaughtException', (err) => {
err.rethrow = true;
throw err;
});

function throwException() {
throw new Error('boom');
}

throwException();
} else {
const assert = require('assert');
const { spawnSync } = require('child_process');
const result = spawnSync(process.execPath, [__filename, 'child']);

assert.strictEqual(result.status, 7);
assert.strictEqual(result.signal, null);
assert.strictEqual(result.stdout.toString().trim(), '');
// Verify that the error was thrown and that the stack was preserved.
const stderr = result.stderr.toString();
assert(/Error: boom/.test(stderr));
assert(/at throwException/.test(stderr));
assert(/rethrow: true/.test(stderr));
}

0 comments on commit 36fdf1a

Please sign in to comment.