Skip to content

Commit

Permalink
events: show inspected error in uncaught 'error' message
Browse files Browse the repository at this point in the history
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: nodejs/help#1729

PR-URL: #25621
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Matheus Marchini <mat@mmarchini.me>
  • Loading branch information
addaleax authored and BethGriggs committed May 10, 2019
1 parent 6e5c208 commit ef14709
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
11 changes: 10 additions & 1 deletion lib/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,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
}
Expand Down
15 changes: 14 additions & 1 deletion test/parallel/test-event-emitter-errors.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';
const common = require('../common');
const EventEmitter = require('events');
const util = require('util');

const EE = new EventEmitter();

Expand All @@ -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,
Expand Down

0 comments on commit ef14709

Please sign in to comment.