繁体   English   中英

为什么会出现未定义的错误?

[英]why am I getting an undefined error?

我正在使用JavaScript调试工具,目前需要的是使行号脱离堆栈跟踪的末尾。 因此,我编写了以下函数来获取堆栈跟踪,删除前几行,然后使用indexOf(':')来获取行号。 但是,我不断收到“无法调用未定义的方法'substring'”错误。 好的,应该很容易解决,但是请稍等-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

甚至更奇怪的是-如果我将try.catch中的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;
    });
    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运行它时,我错过了该错误,因为有很多输出,并且我一直滚动到顶部并仅检查第一个。

谢谢大家的答复:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM