summaryrefslogtreecommitdiff
path: root/lib/repl.js
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-08-21 03:22:18 +0200
committerRuben Bridgewater <ruben@bridgewater.de>2018-08-27 14:08:43 +0200
commitccb303e03795cee25527edb867f7903477ed5de6 (patch)
tree14e8cf7cb3d2fc6c5a0f0f2ec357217894b97ecd /lib/repl.js
parent50aa85dc9bf47c7fad280aba40401a14c81a1aac (diff)
downloadandroid-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.js61
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();