2016-09-14 2 views
1

私はエラーを拡張することによりHTTPErrorクラスを作成してみました:es6にはErrorから継承し、コンストラクタをスタックトレースに持たない方法はありますか?

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のコンストラクタです。興味深いもの(作成されたもの)は、第2のrepl:1:9行です。これを回避する方法はありますか?

答えて

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コンストラクタのバグ、それを呼び出すと思います。まだスタックトレースの標準はないので、これは完全に実装依存の動作です。

+0

「Error.captureStackTrace」が問題を解決しました。しかし、それは第2引数として 'HTTPError'でなければなりません。 –

+0

@ PatrickJ.S。 'new HTTPError'を呼び出すと、' new.target'は 'HTTPError'ですが、自動的にサブクラスを参照します – Bergi

+0

ああ、' new.target'が現在のノードで安定していないためです6.x、それは)。 –

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') 
    } 
} 
関連する問題