Описание на этой странице определенно немного сложное, вот как это делается:
Error.prepareStackTrace = function(error, stack) {
return stack;
};
var someObj = {
someMethod : function () {
crash();
}
}
function bar(barArg) { someObj.someMethod(); };
function foo(fooArg) { bar("barArgString"); };
function getTrace(e) {
var stack = e.stack;
var trace = "";
for (var i = 0; i < stack.length; i++) {
var frame = stack[i],
func = frame.getFunction();
trace += "\r" + frame.getThis() + "." + frame.getFunctionName();
}
return trace;
}
try {
foo("fooArgString");
} catch (e) {
alert("trace from catch(): " + getTrace(e));
}
Это покажет:
trace from catch():
[object Object].someObj.someMethod
[object Window].bar
[object Window].foo
[object Window].
Последний кадр - глобальная область (без имени функции).
По существу, ваше переопределение prepareStackTrace () приводит к тому, что error.stack становится тем, что вы возвращаете из prepareStackTrace (). Хитрость заключается в том, что вторым аргументом prepareStackTrace () является массив объектов CallSite - объектов, которые поддерживают getThis (), getFunctionName () и т. Д.
Приведенный выше код переопределяет prepareStackTrace (), так что он возвращает массив объектов CallSite (параметр «стек» выше), так что это означает, что при попытке ... отловить ошибку Error.stack будет содержать массив CallSite объекты вместо обычной трассировки стека в виде строки. Другой подход заключается в обработке объектов CallSite внутри замещающей функции prepareStackTrace () и возвращении альтернативной трассировки стека в виде строки.
Обратите внимание, что объекты CallSite действительно привередливы. Попробуйте сделать frame.toString (), или просто попытаться предупредить (frame) (неявно это включает toString ()), и он вылетает, и инструменты разработчика Chrome не показывают ошибки.