mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
process: inspect error in case of a fatal exception
This makes sure that errors that shut down the application are inspected with `util.inspect()`. That makes sure that all extra properties on the error will be visible and also that the stack trace is highlighted (Node.js internal frames will be grey and node modules are underlined). PR-URL: https://github.com/nodejs/node/pull/27243 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
ac2f2cd919
commit
a9f518c901
@ -142,8 +142,12 @@ function createFatalException() {
|
||||
if (exceptionHandlerState.captureFn !== null) {
|
||||
exceptionHandlerState.captureFn(er);
|
||||
} else if (!process.emit('uncaughtException', er, type)) {
|
||||
// If someone handled it, then great. otherwise, die in C++ land
|
||||
// If someone handled it, then great. Otherwise, die in C++ land
|
||||
// since that means that we'll exit the process, emit the 'exit' event.
|
||||
const { inspect } = require('internal/util/inspect');
|
||||
const colors = internalBinding('util').guessHandleType(2) === 'TTY' &&
|
||||
require('internal/tty').hasColors() ||
|
||||
inspect.defaultOptions.colors;
|
||||
try {
|
||||
if (!process._exiting) {
|
||||
process._exiting = true;
|
||||
@ -157,6 +161,7 @@ function createFatalException() {
|
||||
const { kExpandStackSymbol } = require('internal/util');
|
||||
if (typeof er[kExpandStackSymbol] === 'function')
|
||||
er[kExpandStackSymbol]();
|
||||
er.stack = inspect(er, { colors });
|
||||
} catch {
|
||||
// Nothing to be done about it at this point.
|
||||
}
|
||||
|
@ -15,4 +15,20 @@ AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
at *
|
||||
at *
|
||||
at *
|
||||
at *
|
||||
at * {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: foo
|
||||
at assert.throws.bar (*assert_throws_stack.js:*)
|
||||
at getActual (assert.js:*)
|
||||
at Function.throws (assert.js:*)
|
||||
at Object.<anonymous> (*assert_throws_stack.js:*:*)
|
||||
at *
|
||||
at *
|
||||
at *
|
||||
at *
|
||||
at *
|
||||
at *,
|
||||
expected: [Object],
|
||||
operator: 'throws'
|
||||
}
|
||||
|
@ -13,4 +13,10 @@ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
at Module.load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module._load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module.runMain (internal/modules/cjs/loader.js:*:*)
|
||||
at internal/main/run_main_module.js:*:*
|
||||
at internal/main/run_main_module.js:*:* {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 1,
|
||||
expected: 2,
|
||||
operator: 'strictEqual'
|
||||
}
|
||||
|
@ -16,4 +16,20 @@ AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error
|
||||
at Module.load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module._load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module.runMain (internal/modules/cjs/loader.js:*:*)
|
||||
at internal/main/run_main_module.js:*:*
|
||||
at internal/main/run_main_module.js:*:* {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: test error
|
||||
at c (*if-error-has-good-stack.js:*:*)
|
||||
at b (*if-error-has-good-stack.js:*:*)
|
||||
at a (*if-error-has-good-stack.js:*:*)
|
||||
at Object.<anonymous> (*if-error-has-good-stack.js:*:*)
|
||||
at Module._compile (internal/modules/cjs/loader.js:*:*)
|
||||
at Object.Module._extensions..js (internal/modules/cjs/loader.js:*:*)
|
||||
at Module.load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module._load (internal/modules/cjs/loader.js:*:*)
|
||||
at Function.Module.runMain (internal/modules/cjs/loader.js:*:*)
|
||||
at internal/main/run_main_module.js:*:*
|
||||
expected: null,
|
||||
operator: 'ifError'
|
||||
}
|
||||
|
@ -3,4 +3,4 @@ before
|
||||
JSON.stringify(array);
|
||||
^
|
||||
|
||||
RangeError: Maximum call stack size exceeded
|
||||
[RangeError: Maximum call stack size exceeded]
|
||||
|
@ -1,4 +1,4 @@
|
||||
*test*message*throw_custom_error.js:*
|
||||
throw ({ name: 'MyCustomError', message: 'This is a custom message' });
|
||||
^
|
||||
MyCustomError: This is a custom message
|
||||
{ name: 'MyCustomError', message: 'This is a custom message' }
|
||||
|
@ -2,4 +2,4 @@ before
|
||||
*test*message*throw_in_line_with_tabs.js:*
|
||||
throw ({ foo: 'bar' });
|
||||
^
|
||||
[object Object]
|
||||
{ foo: 'bar' }
|
||||
|
@ -1,4 +1,4 @@
|
||||
*test*message*throw_non_error.js:*
|
||||
throw ({ foo: 'bar' });
|
||||
^
|
||||
[object Object]
|
||||
{ foo: 'bar' }
|
||||
|
@ -77,5 +77,5 @@ errExec('throws_error6.js', common.mustCall((err, stdout, stderr) => {
|
||||
|
||||
// Object that throws in toString() doesn't print garbage
|
||||
errExec('throws_error7.js', common.mustCall((err, stdout, stderr) => {
|
||||
assert.ok(/<toString\(\) threw exception/.test(stderr));
|
||||
assert.ok(/throw {\r?\n\^\r?\n{ toString: \[Function: toString] }\r?\n$/.test(stderr));
|
||||
}));
|
||||
|
10
test/pseudo-tty/test-fatal-error.js
Normal file
10
test/pseudo-tty/test-fatal-error.js
Normal file
@ -0,0 +1,10 @@
|
||||
'use strict';
|
||||
require('../common');
|
||||
|
||||
const { inspect } = require('util');
|
||||
|
||||
inspect.defaultOptions.colors = true;
|
||||
|
||||
const err = new TypeError('foobar');
|
||||
err.bla = true;
|
||||
throw err;
|
14
test/pseudo-tty/test-fatal-error.out
Normal file
14
test/pseudo-tty/test-fatal-error.out
Normal file
@ -0,0 +1,14 @@
|
||||
*test-fatal-error.js:*
|
||||
throw err;
|
||||
^
|
||||
|
||||
TypeError: foobar
|
||||
at Object.<anonymous> (*test-fatal-error.js:*)
|
||||
*[90m at *(internal*loader.js:*:*)*[39m
|
||||
*[90m at *(internal*loader.js:*:*)*[39m
|
||||
*[90m at *(internal*loader.js:*:*)*[39m
|
||||
*[90m at *(internal*loader.js:*:*)*[39m
|
||||
*[90m at *[39m
|
||||
*[90m at *[39m {
|
||||
bla: *[33mtrue*[39m
|
||||
}
|
Loading…
Reference in New Issue
Block a user