diff --git a/lib/util.js b/lib/util.js index 8048caecba00ed..31761f0dd35545 100644 --- a/lib/util.js +++ b/lib/util.js @@ -38,13 +38,17 @@ const inspectDefaultOptions = Object.seal({ breakLength: 60 }); +const CIRCULAR_ERROR_MESSAGE = 'Converting circular structure to JSON'; + var Debug; function tryStringify(arg) { try { return JSON.stringify(arg); - } catch (_) { - return '[Circular]'; + } catch (err) { + if (err.name === 'TypeError' && err.message === CIRCULAR_ERROR_MESSAGE) + return '[Circular]'; + throw err; } } diff --git a/test/parallel/test-util-format.js b/test/parallel/test-util-format.js index 49b234e2e2bbf7..a57a8094ac05ba 100644 --- a/test/parallel/test-util-format.js +++ b/test/parallel/test-util-format.js @@ -86,6 +86,16 @@ assert.strictEqual(util.format('o: %j, a: %j'), 'o: %j, a: %j'); assert.strictEqual(util.format('%j', o), '[Circular]'); } +{ + const o = { + toJSON() { + throw new Error('Not a circular object but still not serializable'); + } + }; + assert.throws(() => util.format('%j', o), + /^Error: Not a circular object but still not serializable$/); +} + // Errors const err = new Error('foo'); assert.strictEqual(util.format(err), err.stack);