Javascript 自定义错误格式

Javascript 自定义错误格式,javascript,node.js,Javascript,Node.js,我已经实现了自己的自定义错误: 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, { constru

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

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
    }
});
我缺少的是让它在屏幕上显示自己,就像发生常规的非故意错误时一样,也就是说,如果我们抛出新错误('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
但我得到的是:

{ [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!' }
{[MyError:Ops!]
名称:“MyError”,
堆栈:“MyError:Ops!\n在MyError.Error(native)\n在new MyError(D:\\NodeJS\\tests\\test1.js:2:22)\n在对象上。(D:\\NodeJS\\tests\\test1.js:22:11)\n在模块上。\u在O上编译(Module.js:425:26)\n
object.Module.\u extensions..js(Module.js:432:10)\n在Module.load(Module.js:356:32)\n在Function.Module.\u load(Module.js:313:12)\n在Function.Module.runMain(Module.js:457:10)\n在启动时(node.js:138:18)\n
在node.js:974:3',
消息:'Ops!'
要使
console.log(e)
自动为
MyError
输出相同格式的演示文稿,而不必使用显式
e.stack
引用,还需要做些什么

更新:起初,我看到了一些关于要实现的方法
toJSON
的建议,我做到了,但效果不太好。我假设必须有一个可重写的方法,
console.log
使用它来格式化错误对象,但它是什么呢?

试试这个

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)
MyError:Ops!
在MyError.Error处(本机)
在新迈耶罗(:3:22)
时间:18:11
在Object.InjectedScript._evaluateOn(:875:140)
在Object.InjectedScript.\u evaluateAndWrap(:808:34)
在Object.InjectedScript.evaluate(:664:21)

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

我已经编写了一个函数来处理未捕获的异常错误,以便服务器不会因未处理的错误而停止

功能

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)

希望这能有所帮助。

这不是很推荐,但您可以始终挂接
控制台。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);
}

Fiddle:

您应该重写
inspect
,而不是重写
toJSON
方法(或者通常假设的,
toString
),这是在V8中尝试
控制台.log
对象时使用的方法

例如:

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

应该可以做到这一点。

好吧,我假设只是在抛出错误时记录的错误不同,而不是记录错误对象。所以如果你扔了它,也许你会得到同样的格式。不管怎样,看看你的属性,你总是可以创建自己的日志函数来匹配这种格式。@MinusFour,…我自己的
log
函数?请你澄清一下好吗?它将如何使
console.log(e)
输出正确格式的错误?但是,默认情况下,错误会很好地显示在控制台中。。。使用callstack和所有东西…@Sebas只有在未处理时才使用。当你处理它们并使用
console.log
时,它们会变得很难看。@vitaly-t为什么不使用
console.error()
来代替呢?输出很好,是的,但我希望有一种方法可以自动生成这样的输出,而不需要明确引用
e.stack
。没有办法扩展MyError来实现这一点吗?问题是,
e
可能指的是其他错误,包括那些不一定有任何
堆栈的错误。我已经更新了问题的底部部分来澄清这一点。简而言之,我的问题是:如何使
控制台。log
显示格式良好的自定义错误?这正是我想要的答案!非常感谢你!
MyError.prototype.inspect = function () {
    return this.stack;
};