自定义错误格式

我已经实现了我自己的自定义错误:

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 } }); 

而我所缺less的就是使它在屏幕上显示,就像发生一个常规的非显式错误,也就是说,如果我们throw new Error('Hello!') ,我们得到输出:

 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 

现在我想要这样的格式化输出:

 try { throw new MyError("Ops!"); } catch (e) { console.log(e); } 

但是我得到:

 { [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!' } 

还需要做什么才能使console.log(e)输出与MyError相同的格式良好的表示,而不必使用显式的e.stack引用?

更新:起初,我看到了一些关于toJSON方法的build议,我这样做了,但没有成功。 我认为必须有一个可重写的方法, console.log用来格式化一个错误对象,但它是什么呢?

而不是重写toJSON方法(或者,经常假设的toString ),你应该重写inspect ,当试图在console.log中使用V8中的一个对象。

例如:

 MyError.prototype.inspect = function () { return this.stack; }; 

应该可以做的伎俩。

尝试这个

 try { throw new MyError("Ops!"); } catch (e) { console.log(e.stack); } 

如果您在浏览器的控制台中执行此代码,它将显示如下:

 MyError: Ops! at MyError.Error (native) at new MyError (<anonymous>:3:22) at <anonymous>:18:11 at Object.InjectedScript._evaluateOn (<anonymous>:875:140) at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34) at Object.InjectedScript.evaluate (<anonymous>:664:21) 

如果我正确理解你想要的是打印你的错误的堆栈?

我写了一个函数来处理uncaughtException错误,以便服务器不会停止未处理的错误。

function

 function errorHandler (){ process.on('uncaughtException', function (err) { console.log(err); // Displays the Error; console.error((new Date).toUTCString() + ' uncaughtException:', err.message); // Displays the Date and Error Message. console.error(err.stack); // Stack in Which the error occurred. }); } 

产量

 ISODate("2015-07-28T04:56:20.000Z") uncaughtException: Cannot read property 'asset' of undefined TypeError: Cannot read property 'asset' of undefined\n at /Path/file.js:31:31\n at /path/node_modules/mongodb/lib/mongo_client.js:436:11\n at process._tickDomainCallback (node.js:463:13) 

希望这可以帮助。

这不是很推荐,但你总是可以钩住console.log处理程序:

 var oldhandler = console.log; console.log = function () { if (typeof(arguments[0].stack) != "undefined" && arguments[0] instanceof(Error) && typeof(arguments[0].stack) != "undefined") { oldhandler.apply(console,[arguments[0].stack]); } else { oldhandler.apply(console,arguments); } } try { throw new Error("qweqew"); } catch (ex) { console.log(ex); } 

小提琴: http : //jsfiddle.net/xagpf5ff/