diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2018-08-21 03:22:18 +0200 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2018-08-27 14:08:43 +0200 |
commit | ccb303e03795cee25527edb867f7903477ed5de6 (patch) | |
tree | 14e8cf7cb3d2fc6c5a0f0f2ec357217894b97ecd /lib/repl.js | |
parent | 50aa85dc9bf47c7fad280aba40401a14c81a1aac (diff) | |
download | android-node-v8-ccb303e03795cee25527edb867f7903477ed5de6.tar.gz android-node-v8-ccb303e03795cee25527edb867f7903477ed5de6.tar.bz2 android-node-v8-ccb303e03795cee25527edb867f7903477ed5de6.zip |
repl: improve error output
1) Currently extra properties on an error will be ignored, if thrown.
This information will from now on be visible.
2) In case someone threw a non error object it would have resulted in
`[object Object]`. Instead, the full object will now be visible.
3) Some cases were not detected properly as error before and "Thrown: "
was visible before. That is now fixed.
PR-URL: https://github.com/nodejs/node/pull/22436
Refs: https://github.com/nodejs/node/issues/20253
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/repl.js')
-rw-r--r-- | lib/repl.js | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/lib/repl.js b/lib/repl.js index a0cf2c1dd0..ad1a4bab91 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -410,29 +410,50 @@ function REPLServer(prompt, self._domain.on('error', function debugDomainError(e) { debug('domain error'); - const top = replMap.get(self); - const pstrace = Error.prepareStackTrace; - Error.prepareStackTrace = prepareStackTrace(pstrace); - if (typeof e === 'object') + let errStack = ''; + + if (typeof e === 'object' && e !== null) { + const pstrace = Error.prepareStackTrace; + Error.prepareStackTrace = prepareStackTrace(pstrace); internalUtil.decorateErrorStack(e); - Error.prepareStackTrace = pstrace; - const isError = internalUtil.isError(e); - if (!self.underscoreErrAssigned) - self.lastError = 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 (isError && self.replMode === exports.REPL_MODE_STRICT) { - e.stack = e.stack.replace(/(\s+at\s+repl:)(\d+)/, - (_, pre, line) => pre + (line - 1)); + Error.prepareStackTrace = pstrace; + + if (e.domainThrown) { + delete e.domain; + delete e.domainThrown; + } + + if (internalUtil.isError(e)) { + if (e.stack) { + if (e.name === 'SyntaxError') { + // Remove stack trace. + e.stack = e.stack + .replace(/^repl:\d+\r?\n/, '') + .replace(/^\s+at\s.*\n?/gm, ''); + } else if (self.replMode === exports.REPL_MODE_STRICT) { + e.stack = e.stack.replace(/(\s+at\s+repl:)(\d+)/, + (_, pre, line) => pre + (line - 1)); + } + } + errStack = util.inspect(e); + + // Remove one line error braces to keep the old style in place. + if (errStack[errStack.length - 1] === ']') { + errStack = errStack.slice(1, -1); + } + } } - if (isError && e.stack) { - top.outputStream.write(`${e.stack}\n`); - } else { - top.outputStream.write(`Thrown: ${String(e)}\n`); + + if (errStack === '') { + errStack = `Thrown: ${util.inspect(e)}`; } + + if (!self.underscoreErrAssigned) { + self.lastError = e; + } + + const top = replMap.get(self); + top.outputStream.write(`${errStack}\n`); top.clearBufferedCommand(); top.lines.level = []; top.displayPrompt(); |