16

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オブジェクトのコンテキストが表示され、「new MyError()」で作成したMyErrorオブジェクトではなく、MyErrorのプロトタイプになります。

プロトタイプではなく、実際のエラーの正しいバックトレースデータを取得する方法はありますか?

4

2 に答える 2

37

スーパー関数-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

于 2011-12-10T22:41:54.637 に答える
3

@ジェイクマール、ここに1つの良い答えがあります。ただし、おそらくここに別の同様の解決策があります

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を参照することができます。

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 }
于 2015-11-24T10:06:26.240 に答える