当你得到一个不相关的行号时,你如何追踪 JavaScript 的“Unexpected token”错误?

Posted

技术标签:

【中文标题】当你得到一个不相关的行号时,你如何追踪 JavaScript 的“Unexpected token”错误?【英文标题】:How do you track down JavaScript's "Unexpected token" errors when you get an irrelevant line number? 【发布时间】:2015-08-11 06:22:29 【问题描述】:

我查看了一些关于 javascript 报告意外令牌但未提供有用行号的问题(localhost/index.html 的第 1 行是“”):

Uncaught SyntaxError: Unexpected token u                                      localhost:/1

现在我看到了许多“未捕获的语法错误”的帖子,但我想退后一步,不仅要问我当前的代码有什么问题(React JSX 位于 http://pastebin.com/P3Epzi0q,HTML 位于http://pastebin.com/0abjnmZz 不是特别有趣),但是如何最好地确定在处理“未捕获的语法错误”时该怎么做,该错误仅包括与罪魁祸首无关的归因。

除了使用断点和单步执行之外,我目前的尝试是深入了解它在我的代码中发生的位置。我正在加载包括 Showdown、jQuery 和 ReactJS 在内的外部源,但在我的代码中的两个 console.log() 语句之间发生了崩溃:

  console.log("Reached 10");
  React.render(<Pragmatometer />,
    document.getElementById('main'));
  console.log("Reached 11");

这仍然是一个非常大的领域,我正在深入研究,看看我可以放置崩溃前发生的 console.log() 语句的最后一个位置,以及我可以放置的最早位置是什么没有发生的 console.log() 语句,只是崩溃。

除了 Chrome 调试器可能更精巧(或者这就是答案?)之外,判断问题出在哪里的最佳方法是什么?是否有一个 linter 可以提供更多有用的诊断信息,尤其是故障的行号?

也许这个问题属于programmers.stackexchange.com,但似乎有关于未捕获的SyntaxErrors的重复问题,并且响应已经指出代码sn-ps中的错误但没有(据我所知)解释如何在没有有用的行号时查明故障。

我目前隐约受到二进制搜索启发的使用向下钻取记录是最佳路线吗?有更好的吗?

谢谢,

【问题讨论】:

你可以使用调试器来单步调试代码 正如@Rooster 所说,根据您的描述,您只想在调试器中熟悉 F11。 “专业版”提示:如果您使用的是CDN,然后继续调试到你的React.render(); 调用。在调试时随意console.log 那些本地文件,然后完成后恢复为原始文件。但是,当您可以使用 Chrome 或 Firefox(或 IE 等)调试器进行单步调试时,通常没有很好的理由使用 console.log 进行调试。 快速抛开:你不是在寻找一个 linter。您应该对代码进行 lint,这可能会出现导致此问题的错误,当然。但是,如果错误发生在 lib 内部,您需要的是一个跟踪实时执行上下文的调试器,而不是 linter,它可以确保您的代码 在执行之前遵循某些实践。 感谢@all 的建议。进入调试器... 【参考方案1】:

面包屑备注:我在调试器上花了一个小时,部分原因是我没有意识到在抛出错误后步入会继续前进。

在这种情况下,如果没有保存任何内容,localStorage[foo] 将返回 null 的错误或过时信息;它返回未定义,它通过了我的非空检查,并且 JSON.parse() 在输入字符串“未定义”时抛出异常。

【讨论】:

嗯,如果错误发生在JSON.parse 中,那么它应该有一个堆栈跟踪。不是吗? I did not realize that stepping-in would continue to move forward after the error was thrown. 可能没有。如果它被try 捕获,它应该继续下去。不确定你看到了什么。顺便说一句,如果您的“非空”检查看起来像 if (null !== obj),是否有理由不简单地检查 truthiness? if (obj) 如果你有 0"" (等),那可能会变得古怪,但你没有遇到你描述的问题。但是,是的,如果您没有初始化为null,默认将是undefined; alt 是检查undefined

以上是关于当你得到一个不相关的行号时,你如何追踪 JavaScript 的“Unexpected token”错误?的主要内容,如果未能解决你的问题,请参考以下文章

KnockoutJS 3.X API 第三章 计算监控属性 KO如何实现依赖追踪

为啥我不能返回 realloc 的结果? (当你看到代码时你会得到问题......)

MATLAB 调试器不再显示行号

Firefox更新,iOS 下默认打开追踪保护

vi命令加行号查找替换等命令

程序执行时如何打印文件路径和行号?