src: allow fatal exceptions to be enhanced
This commit allows fatal exceptions to be enhanced so that exceptions thrown from an unhandledException handler have the stack attached properly. PR-URL: https://github.com/nodejs/node/pull/28562 Fixes: https://github.com/nodejs/node/issues/28550 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
7cf6f9e964
commit
36fdf1aa6c
@ -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);
|
||||
}
|
||||
}
|
||||
|
28
test/parallel/test-unhandled-exception-rethrow-error.js
Normal file
28
test/parallel/test-unhandled-exception-rethrow-error.js
Normal file
@ -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));
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user