Javascript “如何调试”;未捕获异常:未定义(未知)";在Firefox中

Javascript “如何调试”;未捕获异常:未定义(未知)";在Firefox中,javascript,debugging,firefox,exception,uncaught-exception,Javascript,Debugging,Firefox,Exception,Uncaught Exception,我正在开发的JavaScript应用程序中的控制台(仅在Firefox中)中出现了这一行: 它似乎相对无害,但我很好奇是否有任何方法可以推断它的起源,因为它一定来自某个地方,即使它声称“未知”。将整个脚本包装在一个try/catch块中并切换Firefox的“暂停异常”设置没有任何作用,这似乎意味着它是一个特殊的异常?我有一些想法,我的代码的哪些部分可能会导致它使用工作草案API,但我更感兴趣的是为什么它会以这种方式报告,以及我能做些什么。Firefox没有提供更多细节吗 有几种方法可以尝试消

我正在开发的JavaScript应用程序中的控制台(仅在Firefox中)中出现了这一行:


它似乎相对无害,但我很好奇是否有任何方法可以推断它的起源,因为它一定来自某个地方,即使它声称“未知”。将整个脚本包装在一个try/catch块中并切换Firefox的“暂停异常”设置没有任何作用,这似乎意味着它是一个特殊的异常?我有一些想法,我的代码的哪些部分可能会导致它使用工作草案API,但我更感兴趣的是为什么它会以这种方式报告,以及我能做些什么。Firefox没有提供更多细节吗

有几种方法可以尝试消除这个bug

有一件事非常乏味,但会让您知道异常的行号,那就是如下代码:

foo();
console.log("Line 1");
bar();
console.log("Line 2");
baz();
console.log("Line 3");
以此类推,如果您在控制台中看到:

Line 1
Line 2
Uncaught exception: undefined
undefined
Uncaught exception: undefined
然后您就知道是baz()导致了错误。另一种方法是使用调试器,如下所示:

debugger;
foo();
bar();
baz();
您可以使用firefox的调试器检查每一行,看看哪一行将错误抛出控制台

如果您有很多代码,可以尝试分而治之的技巧,如下所示:

var fooStr = foo();
var fooArr = fooStr.split("");
fooArr = fooArr.reverse();
foo(fooArr.join(""));
console.log("Block one");

var barStr = bar();
var barArr = barStr.split("");
barArr = barArr.reverse();
bar(barArr.join(""));
console.log("Block two");

var bazStr = baz();
var bazArr = bazStr.split("");
bazArr = bazArr.reverse();
baz(bazArr.join(""));
console.log("Block three");
Block one
Uncaught exception: undefined
console.log(barStr);
var barArr = barStr.split("");
function bar(value){
    return strings[value];
}
然后,如果控制台如下所示:

var fooStr = foo();
var fooArr = fooStr.split("");
fooArr = fooArr.reverse();
foo(fooArr.join(""));
console.log("Block one");

var barStr = bar();
var barArr = barStr.split("");
barArr = barArr.reverse();
bar(barArr.join(""));
console.log("Block two");

var bazStr = baz();
var bazArr = bazStr.split("");
bazArr = bazArr.reverse();
baz(bazArr.join(""));
console.log("Block three");
Block one
Uncaught exception: undefined
console.log(barStr);
var barArr = barStr.split("");
function bar(value){
    return strings[value];
}
那么问题就在第二区。然后,您可以这样做:

var barStr = bar();
console.log("Line 1");
var barArr = barStr.split("");
console.log("Line 2");
barArr = barArr.reverse();
console.log("Line 3");
bar(barArr.join(""));
console.log("Line 4");
console.log("Block two");
console.log("Line 5");
如果你看到:

Line 1
Uncaught exception: undefined
然后您知道
var barArr=barStr.split(“”)是您的问题。从那时起,您可能需要记录变量值,如下所示:

var fooStr = foo();
var fooArr = fooStr.split("");
fooArr = fooArr.reverse();
foo(fooArr.join(""));
console.log("Block one");

var barStr = bar();
var barArr = barStr.split("");
barArr = barArr.reverse();
bar(barArr.join(""));
console.log("Block two");

var bazStr = baz();
var bazArr = bazStr.split("");
bazArr = bazArr.reverse();
baz(bazArr.join(""));
console.log("Block three");
Block one
Uncaught exception: undefined
console.log(barStr);
var barArr = barStr.split("");
function bar(value){
    return strings[value];
}
如果您在控制台中看到:

Line 1
Line 2
Uncaught exception: undefined
undefined
Uncaught exception: undefined
然后您就知道
bar()
正在返回
未定义的
(而不是字符串),它没有
拆分方法。然后你看条形码来确定,比如说,你是否忘记了一个参数?Mabey
bar
看起来像这样:

var fooStr = foo();
var fooArr = fooStr.split("");
fooArr = fooArr.reverse();
foo(fooArr.join(""));
console.log("Block one");

var barStr = bar();
var barArr = barStr.split("");
barArr = barArr.reverse();
bar(barArr.join(""));
console.log("Block two");

var bazStr = baz();
var bazArr = bazStr.split("");
bazArr = bazArr.reverse();
baz(bazArr.join(""));
console.log("Block three");
Block one
Uncaught exception: undefined
console.log(barStr);
var barArr = barStr.split("");
function bar(value){
    return strings[value];
}

strings
是一个包含某些内容的对象。因此,
strings[undefined]
将返回
undefined
,它没有
split
方法。虫子压扁了

您可以转到about:config并创建一个布尔首选项dom.report\u all\u js\u异常。
这将迫使更多的异常出现在错误控制台中


我发现了一个简单的例子,重现了您看到的错误

<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script>
        throw undefined
    </script>
</head>

<body>
</body>

</html>
这正是你得到的。这让我相信错误发生在嵌入html的脚本中

知道您可能希望将所有这些脚本移动到它们自己的文件中,以便可以正常调试代码

更新

我偶然发现了另一种方法,你可以得到这样的错误。它以
eval
的形式出现

index.html

<!doctype html>
<html>
<head>
  <script src="script.js"></script>
</head>
<body></body>
</html>

使用不同的浏览器-Chrome有时会帮助您调试Firefox(或Firebug)无法捕获的问题。@user2182349好吧,这个问题根本不会出现在Chrome中。解决这个问题并不是很关键,我只是想知道是否有任何方法可以解决这样的问题,或者为什么Firefox会这样做。当你打开Debugger时,在Debugger选项卡上,当你点击右边的gear时。有一个选项叫做“暂停异常”,也可以取消选择“忽略捕获的异常”,然后重新加载页面。我曾经遇到过这样的问题。这是因为Firefox对文档大小的限制,我认为是768k。检查您正在检索的文档的大小。@tik27啊,这显然是我不知道的事情,谢谢。尽管如此,它似乎忽略了这些“未捕获的异常”。所以他们有一些不规则的地方。如果勾选了“忽略捕获的异常”,也没有什么区别,但如果勾选了,暂停会显式忽略Firefox本身称之为“未捕获”的异常,这似乎很有趣。我很感谢您的努力,但我确实了解console.log调试。运行您的“.split()”示例时,Firefox返回“TypeError:barStr未定义”-这是一个比我要处理的更具描述性的错误,因此我不确定您是否知道我在问什么。我确实尝试了Firefox调试器命令,但当我在暂停时与页面交互时,它似乎会使浏览器崩溃,虽然我没有提到它,但我的代码在动画帧上持续运行,因此console.logging和单步执行代码不足以捕获准确的帧,因此会发生错误。忽略
.split()
示例代码。尝试将
console.log(“Dev-console!”)
放在文件顶部并运行它。如果在控制台中看不到任何内容,则存在另一个问题。否则,请在每行后面放置一个
console.log()
,以查找有问题的行。如果这是您正在寻找的答案或它很好地回答了您的问题,请将其标记为已接受。否则,请在评论或问题编辑中解释您想要的内容。我已经对其进行了编辑,澄清了“我有一些想法,我的代码中哪些部分可能导致使用工作草稿API,但我更感兴趣的是,为什么它会以这种方式报告,以及我可以做些什么。”我不想找出这个bug的位置,这正是大多数答案所关注的,但为什么Firefox抛出了一个似乎是唯一的、没有帮助的例外。如果这是一个正常的异常,浏览器工具或try-catch机制应该有助于解释类似的情况,但它似乎不是。试错控制台。记录我的整个脚本似乎是一个非常乏味的练习,特别是当与复杂的逻辑相结合时,如果每个动画帧都执行过,那么过多的console.logging似乎会使浏览器崩溃。很有趣,但我没有任何内联脚本,只有一个外部文件。我认为这可能与Firefox如何处理内部代码中的异常有关。我使用的是Firefox 50(当前版本?)。您可以转到about:config,右键单击首选项列表,然后在上下文菜单中选择New/Boolean,输入“dom.report\u all\u js”