events: show inspected error in uncaught 'error' message

If there is no handler for `.emit('error', value)` and `value`
is not an `Error` object, we currently just call `.toString()`
on it.

Almost always, using `util.inspect()` provides better information
for diagnostic purposes, so prefer to use that instead.

Refs: https://github.com/nodejs/help/issues/1729

PR-URL: https://github.com/nodejs/node/pull/25621
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matheus Marchini <mat@mmarchini.me>
This commit is contained in:
Anna Henningsen 2019-01-21 20:45:55 +01:00
parent 2b65399694
commit eeea0dd1e7
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 24 additions and 2 deletions

View File

@ -172,9 +172,18 @@ EventEmitter.prototype.emit = function emit(type, ...args) {
// up in Node's output if this results in an unhandled exception.
throw er; // Unhandled 'error' event
}
let stringifiedEr;
const { inspect } = require('internal/util/inspect');
try {
stringifiedEr = inspect(er);
} catch {
stringifiedEr = er;
}
// At least give some kind of context to the user
const errors = lazyErrors();
const err = new errors.ERR_UNHANDLED_ERROR(er);
const err = new errors.ERR_UNHANDLED_ERROR(stringifiedEr);
err.context = er;
throw err; // Unhandled 'error' event
}

View File

@ -1,6 +1,7 @@
'use strict';
const common = require('../common');
const EventEmitter = require('events');
const util = require('util');
const EE = new EventEmitter();
@ -9,12 +10,24 @@ common.expectsError(
{
code: 'ERR_UNHANDLED_ERROR',
type: Error,
message: 'Unhandled error. (Accepts a string)'
message: "Unhandled error. ('Accepts a string')"
}
);
common.expectsError(
() => EE.emit('error', { message: 'Error!' }),
{
code: 'ERR_UNHANDLED_ERROR',
type: Error,
message: "Unhandled error. ({ message: 'Error!' })"
}
);
common.expectsError(
() => EE.emit('error', {
message: 'Error!',
[util.inspect.custom]() { throw new Error(); }
}),
{
code: 'ERR_UNHANDLED_ERROR',
type: Error,