回答:
firefoxについてはわかりませんが、v8 / chromeでは、Errorコンストラクターでと呼ばれるメソッドを使用できますcaptureStackTrace
。(詳細はこちら)
したがって、それを取得するハックな方法は次のようになります。
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
通常は、getStackTrace
キャプチャされたときにスタック上にあります。そこでの2番目の引数getStackTrace
は、スタックトレースに含まれないようにします。
Error().stack
。Firefoxではオブジェクト名と関数名が失われ、Chromeではオブジェクト名が失われますが(と同じError.captureStackTrace
)、Error().stack
両方のブラウザーで機能し、デバッグに十分な情報が得られます。
Error.stackが必要です。ChromeとFirefoxで動作します。例えば
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
Chromeで与えるでしょう:
TypeError: Object #<Object> has no method 'debug'
at eval at <anonymous> (unknown source)
at eval (native)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluate (unknown source)
そしてFirefoxでは:
@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
(new Error).stack
これにより、最新のChrome、Firefox、Opera、IE10 +のスタックトレース(文字列の配列として)が得られます
function getStackTrace () {
var stack;
try {
throw new Error('');
}
catch (error) {
stack = error.stack || '';
}
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
使用法:
console.log(getStackTrace().join('\n'));
独自の呼び出しと、ChromeおよびFirefox(IEは除く)で使用されるタイトル「エラー」をスタックから除外します。
古いブラウザではクラッシュせず、空の配列を返すだけです。より普遍的なソリューションが必要な場合は、stacktrace.jsを参照してください。サポートされているブラウザのリストは本当に印象的ですが、私の心には、それが意図されているその小さなタスクにとって非常に大きいです:すべての依存関係を含む37KBの縮小テキスト。
ブラウザ間のスタックトレースを提供する、stacktrace.jsというライブラリがあります。スクリプトを組み込んで、いつでも呼び出すだけで使用できます。
var trace = printStackTrace();
これは、コンスタンティンの優れたコードのマイナーな機能強化にすぎません。スローキャッチの費用を少し削減し、エラースタックをインスタンス化するだけです。
function getStackTrace () {
let stack = new Error().stack || '';
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
通常、特定のレベルのスタックトレース(カスタムロガー用)が必要なので、次のように呼び出すこともできます。
getStackTrace()[2]; // get stack trace info 2 levels-deep