You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I was playing around with dynamically running code and found a difference between standard JS eval and the vm module with custom error code. Here is a code snippet that can be run
varvm=require("vm");varcustomError=`function MyError(message) { this.name = this.constructor.name; this.message = message;};MyError.prototype = Error.prototype;`;varerrorThrower="throw new MyError('MyError');";console.log("Eval - MyError");try{varresult=eval(customError+"\n"+errorThrower);}catch(e){console.log(e.message+"\n");}console.log("Good VM - Error");try{varresult=vm.runInThisContext("throw new Error('Not MyError');","repl");}catch(e){console.log(e.message+"\n");}console.log("Bad VM - MyError");try{varresult=vm.runInThisContext(customError+"\n"+errorThrower,"repl");}catch(e){console.log(e.message+"\n");}console.log("Bad VM - MyError Again");try{varresult=vm.runInThisContext(customError+"\n"+errorThrower,"repl");}catch(e){console.log(e.message+"\n");}
and the output
kamn@kamn:~/Dev/VmEvalTest$ node index.js Eval - MyErrorMyErrorGood VM - ErrorNot MyErrorBad VM - MyErrorrepl:7throw new MyError('MyError');^MyErrorBad VM - MyError AgainMyError
It seems like custom errors in vm output to stdin(?) the first time they happen. They are even caught afterwards. This is not true for a standard Error in vm and both Errors work in JS Eval. I am not sure this is a expected behavior but it does not seem like it. Any feedback would be appreciated.
The reason is that the vm.runInThisContext()'s displayErrors option is true by default. Explicitly setting it to false will get you:
Eval - MyError
MyError
Good VM - Error
Not MyError
Bad VM - MyError
MyError
Bad VM - MyError Again
MyError
The name displayErrors is a bit misleading, but what it actually does is decorate the exception message if true, which is what you're seeing (the filename is added and it points to the source line). When it's false, the error is not decorated, so you just get the exception message itself. Originally when this option was added it did print the exception to stderr IIRC (hence the 'display' part of the name), but that behavior changed some time ago.
if (env->printed_error())
return;
env->set_printed_error(true);
uv_tty_reset_mode();
PrintErrorString("\n%s", arrow);
Why print the error only once? The exception may occur repeatedly. If the output to stderr is allowed, I think it should be printed always rather than once.
Hm, maybe that made sense back in nodejs/node-v0.x-archive#7049, but I don’t see any real point right now either… @indutny you don’t happen to remember, do you?
Activity
mscdex commentedon Jun 24, 2016
The reason is that the
vm.runInThisContext()'sdisplayErrorsoption istrueby default. Explicitly setting it tofalsewill get you:The name
displayErrorsis a bit misleading, but what it actually does is decorate the exception message iftrue, which is what you're seeing (the filename is added and it points to the source line). When it'sfalse, the error is not decorated, so you just get the exception message itself. Originally when this option was added it did print the exception to stderr IIRC (hence the 'display' part of the name), but that behavior changed some time ago.addaleax commentedon Jun 24, 2016
@mscdex Well, there’s also a real bug here; none of the
vmmethods should print anything to stderr under normal circumstances.The reason it does here is this line, and it shouldn’t be too hard to fix this.
vm: don't print out arrow message for custom error
addaleax commentedon Jun 24, 2016
PR: #7398
kamn commentedon Jun 24, 2016
@mscdex: Thank you for the explanation and work around.
@addaleax: Thank you for the quick fix.
adoyle-h commentedon Jun 25, 2016
There is another question.
Why print the error only once? The exception may occur repeatedly. If the output to stderr is allowed, I think it should be printed always rather than once.
addaleax commentedon Jun 25, 2016
Hm, maybe that made sense back in nodejs/node-v0.x-archive#7049, but I don’t see any real point right now either… @indutny you don’t happen to remember, do you?
vm: don't print out arrow message for custom error
vm: don't print out arrow message for custom error
vm: don't print out arrow message for custom error
vm: don't print out arrow message for custom error
vm: don't print out arrow message for custom error