2014-09-28 6 views
0

Я работаю над инструментом отладки javascript, мне нужно в данный момент получить номер строки с конца трассировки стека. Поэтому я написал следующую функцию, чтобы получить трассировку стека, удалить первые несколько строк, а затем я буду использовать indexOf (':'), чтобы получить номер строки. Однако я продолжаю получать подстроку «Невозможно вызвать метод» неопределенной ошибки. Хорошо, что это должно быть легко исправить, но подождите минуту - console.log подскажет, что файл определен. Может кто-то объяснить, где я ошибаюсь.Почему я получаю неопределенную ошибку?

код:

var getLine = function() { 
    var stack = (new Error('dummy').stack).toString(); 
    var stackLines = stack.split('\n'); 
    stackLines = stackLines.filter(function (element) { 
     var exclude = [ "Error: dummy", "graph.js" ]; 
     for (var i = 0; i < exclude.length; i++) { 
      if (element.indexOf(exclude[i]) !== -1) { 
       return false; 
      } 
     } 
     return true; 
    }); 

    console.log("1 array", stackLines); 
    console.log("2 element", stackLines[0]); 
    console.log("3 typeof element", typeof (stackLines[0])); 
    console.log("4 huh?", stackLines[0].substring(1)); 
} 

выход:

1 array [ ' at Object.<anonymous> (E:\\Development\\james\\main.js:52:18)', 
    ' at Module._compile (module.js:456:26)' ] 
2 element  at Object.<anonymous> (E:\Development\james\main.js:52:18) 
3 typeof element string 
E:\Development\james\graph.js:47 
    console.log("huh?", stackLines[0].substring(1)); 
            ^
TypeError: Cannot call method 'substring' of undefined 

четная Stanger вещь - если я обернуть console.log заявления в Try/уловом, то он выполняется без ошибок?

код:

var getLine = function() { 
    var stack = (new Error('dummy').stack).toString(); 
    var stackLines = stack.split('\n'); 
    stackLines = stackLines.filter(function (element) { 
     var exclude = [ "Error: dummy", "graph.js" ]; 
     for (var i = 0; i < exclude.length; i++) { 
      if (element.indexOf(exclude[i]) !== -1) { 
       return false; 
      } 
     } 
     return true; 
    }); 
    try { 
     console.log("array", stackLines); 
     console.log("element", stackLines[0]); 
     console.log("typeof element", typeof (stackLines[0])); 
     console.log("huh?", stackLines[0].substring(stackLines[0].indexOf(":"))); 
    } catch (e){ 
     console.log("error",e); 
    } 

выход:

1 array [ ' at Object.<anonymous> (E:\\Development\\james\\main.js:52:18)', 
    ' at Module._compile (module.js:456:26)' ] 
2 element  at Object.<anonymous> (E:\Development\james\main.js:52:18) 
3 typeof element string 
4 huh? :\Development\james\main.js:52:18) 

Я чувствую, что я что-то очень и очень очевидное не хватает, но я не вижу его!

+0

Это работает просто отлично: http://jsfiddle.net/55ym1xmj/2/ – vrijdenker

+0

Так это ваш фактический код, или вы подправить некоторые вещи здесь, чтобы сделать пример меньше? Потому что иначе в вашем «реальном» коде может быть какое-то состояние гонки. – vrijdenker

+0

Какой браузер вы используете. Стек - это нестандартное свойство Error. см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack –

ответ

0

OK Я докопался его, как я подозревал, что было простое объяснение:

Функции была называться несколько раз, первый stackLines времени [0] был определен, однако один из более позднего времени он не определено. Запутанная часть - это ошибка, которую бросали до того, как были напечатаны console.logs.

Так что в первый раз, когда он был вызван, все операторы журнала будут работать, но ни один из них на самом деле не выводит его перед ошибкой в ​​одном из последующих вызовов.

Когда я запустил его с помощью try catch, я пропустил ошибку, так как была куча вывода, и я прокручивал вверх и только проверял первый.

Спасибо за ответы, все :)

Смежные вопросы