5 ответов:
Я не уверен в firefox, но в v8 / chrome вы можете использовать метод в конструкторе ошибок под названием
captureStackTrace. (подробнее здесь)так что хаки способ получить это будет:
var getStackTrace = function() { var obj = {}; Error.captureStackTrace(obj, getStackTrace); return obj.stack; }; console.log(getStackTrace());как правило,
getStackTraceбудет в стеке, когда он будет захвачен. Второй аргумент там исключаетgetStackTraceот включения в трассировку стека.
ошибка.стек-это то, что вам нужно. Это работает в 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
есть библиотека под названием stacktrace.js это дает вам перекрестные трассировки стека браузера. Вы можете использовать его просто включив скрипт и вызывая в любой момент:
var trace = printStackTrace();
это даст трассировку стека (как массив строк) для современных 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. Его список поддерживаемых браузеров действительно впечатляет, но мой ум очень большой для этой небольшой задачи, для которой он предназначен: 37 КБ минифицированного текста, включая все зависимости.
это лишь незначительное улучшение отличного кода Константина. Он немного сокращается за счет метания-ловли и просто создает экземпляр стека ошибок:
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
Comments