我对在JavaScript中制作自定义Error类的“正确”方法的理解是这样的:
function MyError(message) {
this.name = "MyError";
this.message = message || "Default Message";
}
MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
(代码片段来自https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error。)
使用NodeJS,如果我尝试检查这种类型的错误,如:
var err = new MyError("whoops");
assert.ifError(err);
...回溯将显示我在编译时创建的Error对象的上下文,它是MyError的原型,而不是我用“new MyError()”创建的MyError对象。
是否有某些方法可以为实际错误而不是原型获取正确的回溯数据?
答案 0 :(得分:34)
我们需要调用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);
您可以使用此节点模块轻松扩展错误类型 https://github.com/jayyvis/extend-error
答案 1 :(得分:2)
module.exports = function CustomError(message, extra) {
Error.captureStackTrace(this, this.constructor);
this.name = this.constructor.name;
this.message = message;
this.extra = extra;
};
require('util').inherits(module.exports, Error);
Error.call(this) - 创建另一个错误对象(浪费一大堆时间)并且根本不触及
由于最新的ECMAScript6
版本可以支持Node.js
。 ES6
下的答案可以参考此link。
class MyError extends Error {
constructor(message) {
super(message);
this.message = message;
this.name = 'MyError';
}
}
以下是Node v4.2.1
class MyError extends Error{
constructor(msg, extra) {
super(msg);
this.message = msg;
this.name = 'MyError';
this.extra = extra;
}
};
var myerr = new MyError("test", 13);
console.log(myerr.stack);
console.log(myerr);
输出:
MyError: test
at MyError (/home/bsadmin/test/test.js:5:8)
at Object.<anonymous> (/home/bsadmin/test/test.js:12:13)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:467:10)
at startup (node.js:134:18)
at node.js:961:3
{ [MyError: test] name: 'MyError', extra: 13 }