diff --git a/lib/repl.js b/lib/repl.js index 2b371ed7bcbb54..9a925231f53b14 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -282,17 +282,23 @@ function REPLServer(prompt, self._domain.on('error', function debugDomainError(e) { debug('domain error'); const top = replMap.get(self); + internalUtil.decorateErrorStack(e); + const isError = internalUtil.isError(e); if (e instanceof SyntaxError && e.stack) { // remove repl:line-number and stack trace e.stack = e.stack .replace(/^repl:\d+\r?\n/, '') .replace(/^\s+at\s.*\n?/gm, ''); - } else if (e.stack && self.replMode === exports.REPL_MODE_STRICT) { + } else if (isError && self.replMode === exports.REPL_MODE_STRICT) { e.stack = e.stack.replace(/(\s+at\s+repl:)(\d+)/, (_, pre, line) => pre + (line - 1)); } - top.outputStream.write((e.stack || e) + '\n'); + if (isError && e.stack) { + top.outputStream.write(`${e.stack}\n`); + } else { + top.outputStream.write(`Thrown: ${String(e)}\n`); + } top.bufferedCommand = ''; top.lines.level = []; top.displayPrompt(); diff --git a/test/parallel/test-repl-null-thrown.js b/test/parallel/test-repl-null-thrown.js new file mode 100644 index 00000000000000..1fe5d30396d534 --- /dev/null +++ b/test/parallel/test-repl-null-thrown.js @@ -0,0 +1,24 @@ +'use strict'; +require('../common'); +const repl = require('repl'); +const assert = require('assert'); +const Stream = require('stream'); + +const output = new Stream(); +let text = ''; +output.write = output.pause = output.resume = function(buf) { + text += buf.toString(); +}; + +const replserver = repl.start({ + output: output, + input: process.stdin +}); + +replserver.emit('line', 'process.nextTick(() => { throw null; })'); +replserver.emit('line', '.exit'); + +setTimeout(() => { + console.log(text); + assert(text.includes('Thrown: null')); +}, 0);