如何在NodeJS中获得自定义错误类的正确回溯?

Eva*_* P. 13 javascript inheritance custom-errors node.js

我对在JavaScript中制作自定义Error类的"正确"方法的理解是这样的:

function MyError(message) {  
    this.name = "MyError";  
    this.message = message || "Default Message";  
}  
MyError.prototype = new Error();  
MyError.prototype.constructor = MyError;
Run Code Online (Sandbox Code Playgroud)

(代码片段来自https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error.)

使用NodeJS,如果我尝试检查这种类型的错误,如:

var err = new MyError("whoops");
assert.ifError(err);
Run Code Online (Sandbox Code Playgroud)

...回溯将显示我在编译时创建的Error对象的上下文,它是MyError的原型,而不是我用"new MyError()"创建的MyError对象.

有没有什么方法可以获得实际错误的正确回溯数据,而不是原型?

Jay*_*mar 36

我们需要调用super函数 - captureStackTrace

var util = require('util');

function MyError(message) {
  Error.call(this); //super constructor
  Error.captureStackTrace(this, this.constructor); //super helper method to include stack trace in error object

  this.name = this.constructor.name; //set our function’s name as error name.
  this.message = message; //set the error message
}

// inherit from Error
util.inherits(MyError, Error);
Run Code Online (Sandbox Code Playgroud)

更新:

您可以使用此节点模块轻松扩展错误类型 https://github.com/jayyvis/extend-error

  • 应该使用`util.inherits`而不是弃用的`__proto__`. (5认同)