我正在开发一个 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
更奇怪的是 - 如果我将 console.log 语句包装在 try/catch 中,那么它执行时不会出错?
代码:
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)
我觉得我错过了一些非常非常明显的东西,但我没有看到它!
好吧,我已经追根究底了,因为我怀疑有一个简单的解释:
该函数被多次调用,第一次定义了 stackLines[0],但后来有一次它未定义。令人困惑的部分是在打印 console.logs 之前抛出错误。
因此,第一次调用时,所有日志语句都会起作用,但在后续调用中的一个错误中,实际上没有一个在它之前输出。
当我使用 try catch 运行它时,我错过了错误,因为有一堆输出,而且我滚动到顶部并只检查第一个输出。
谢谢大家的回复:)
在下面 2 分钟的 YouTube 视频中,我们通过简单的解决方案解释并解决了错误。 https://www.youtube.com/watch?v=s7uSST5rfH0&t=41s