1

HTTPErrorエラーを拡張してクラスを作成しようとしました:

class HTTPError extends Error {
   constructor(codeArg, message){
      let code = codeArg || 500;
      super(message || http.STATUS_CODES[code]); // first line in stack trace
      this.code = code;
   }
}

これはほとんど問題なく動作しますがthrow、このようなエラーが発生した場合super、呼び出された行はスタック トレースの最初の行です (nodejs を想定):

> const HTTPError = require('./HTTPError')
undefined
> let e = new HTTPError(418)
undefined
> throw e
Error: I'm a teapot
    at HTTPError (/home/pat/Scripts/js/HTTPError.js:6:6)
    at repl:1:9
    at sigintHandlersWrap (vm.js:32:31)
    at sigintHandlersWrap (vm.js:96:12)
    at ContextifyScript.Script.runInContext (vm.js:31:12)
    at REPLServer.defaultEval (repl.js:308:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:489:10)
    at emitOne (events.js:101:20)
> e.code
418

スタック トレースの最初の行は、 のコンストラクタにありHTTPErrorます。興味深いのは (それが作成された場所) 2repl:1:9行目です。これを回避する方法はありますか?

4

2 に答える 2

2

Error.captureStackTrace標準の ES6 ではありませんが、これを修正できるはずです。

class HTTPError extends Error {
   constructor(codeArg, message){
      let code = codeArg || 500;
      super(message || http.STATUS_CODES[code]);
      Error.captureStackTrace(this, new.target);
      this.code = code;
   }
}

最終的にはコンストラクターのバグと呼びますErrorが、これは必要ありません。スタック トレースの標準はまだないため、これは完全に実装依存の動作です。

于 2016-09-14T12:57:39.347 に答える
1

唯一の方法は、その行をスタックから手動で削除することだと思います。

class HTTPError extends Error {
   constructor(codeArg, message){
      let code = codeArg || 500;
      super(message || http.STATUS_CODES[code]); // first line in stack trace
      this.code = code;
      const stack = this.stack.split('\n')
      stack.splice(1, 1)
      this.stack = stack.join('\n')
   }
}
于 2016-09-14T12:35:55.617 に答える