From ef14709497c75055ab47ddcb5c3e2e1b11221894 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 21 Jan 2019 20:45:55 +0100 Subject: [PATCH] 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 Reviewed-By: Ruben Bridgewater Reviewed-By: Matheus Marchini --- lib/events.js | 11 ++++++++++- test/parallel/test-event-emitter-errors.js | 15 ++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/events.js b/lib/events.js index aed1ab67920560..7971a7363530c9 100644 --- a/lib/events.js +++ b/lib/events.js @@ -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 } diff --git a/test/parallel/test-event-emitter-errors.js b/test/parallel/test-event-emitter-errors.js index ef2bbee93f8bfd..13d3a98d9c0a50 100644 --- a/test/parallel/test-event-emitter-errors.js +++ b/test/parallel/test-event-emitter-errors.js @@ -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,