I made my own mistake:
function MyError() { var temp = Error.apply(this, arguments); temp.name = this.name = 'MyError'; this.stack = temp.stack; this.message = temp.message; } MyError.prototype = Object.create(Error.prototype, { constructor: { value: MyError, writable: true, configurable: true } });
And what I am missing is to make it appear on the screen as if a regular uncontrolled error occurred, i.e. if we do throw new Error('Hello!') , we get the output:
throw new Error('Hello!'); ^ Error: Hello! at Object.<anonymous> (D:\NodeJS\tests\test1.js:28:7) at Module._compile (module.js:425:26) at Object.Module._extensions..js (module.js:432:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:313:12) at Function.Module.runMain (module.js:457:10) at startup (node.js:138:18) at node.js:974:3
Now when I do this, I want the same well formatted output:
try { throw new MyError("Ops!"); } catch (e) { console.log(e); }
but instead I get:
{ [MyError: Ops!] name: 'MyError', stack: 'MyError: Ops!\n at MyError.Error (native)\n at new MyError (D:\\NodeJS\\tests\\test1.js:2:22)\n at Object.<anonymous> (D:\\NodeJS\\tests\\test1.js:22:11)\n at Module._compile (module.js:425:26)\n at O bject.Module._extensions..js (module.js:432:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:313:12)\n at Function.Module.runMain (module.js:457:10)\n at startup (node.js:138:18)\n at node.js:974:3', message: 'Ops!' }
What else needs to be done to make console.log(e) automatically output the same beautifully formatted view for MyError without having to use an explicit e.stack link?
UPDATE: At first, I saw some recommendations regarding the toJSON method that I made, but that didn’t quite work. I assume that there should be an overridable method that console.log uses to format the error object, but what is it?
vitaly-t
source share