可以在JavaScript中捕获语法错误吗?

时间:2011-05-11 10:53:36

标签: javascript

MDN states

  

当JavaScript引擎在解析代码时遇到不符合语言语法的令牌或令牌顺序时,抛出SyntaxError。

但如果出现语法错误,程序怎么可能首先运行呢?

如何捕获JavaScript语法错误?

6 个答案:

答案 0 :(得分:11)

可以通过try-catch捕获运行时错误,而不是语法错误(,如果你eval代码,你可以处理恶意代码中的语法错误,但这很奇怪)。

我建议你阅读这些内容:

答案 1 :(得分:11)

您不能使用try-catch块来处理语法错误,因为它们在解析代码时被抛出而不是在运行时抛出。

但是,您可以使用window.onerror并确定存在错误。您必须确保onerror函数在单独的脚本标记中定义,而不是在可能出现错误的标记中定义!

例如:

这不起作用,因为抛出错误时脚本尚未开始运行:

<script>
  window.onerror = function (e) {
    console.log('Error: ', e);
  };
  console.log('a'');
</script>

这将有效:

<script>
  window.onerror = function (e) {
    console.log('Error: ', e);
  };
</script>
<script>
  console.log('a'');
</script>

jsfiddle demo

答案 2 :(得分:4)

您可以捕获 程序员生成的和运行时异常 ,但是您无法捕获 JavaScript语法错误, 可以使用 window.onerror 在某些浏览器中处理它们。

这取自我非常喜欢的书JavaScript- The Complete Reference by Thomas-Powell。您可以参考该书中的代码示例。

答案 3 :(得分:3)

在JS世界中,SyntaxError可能是运行时异常。例如,当尝试解析不是JSON格式的JSON响应时,可能会出现这种情况。服务器可以发回许多类型的响应,因此,如果您向您的请求发送了一个HTML正文回复,并且希望在正文中使用JSON,那么您将获得SyntaxError JS。在这种情况下,您将收到如下所示的错误消息:SyntaxError: JSON Parse error: Unrecognized token '<'

但是你也可以获得其他运行时语法错误。 Mozilla有一些列表:SyntaxErrors for JSON parsing

您可能希望在代码中捕获这些内容。您可以使用通用的try / catch块执行此操作:

try {
  JSON.parse('<html></html>');
} catch (e) {
  console.log("I catch & handle all errors the same way.");
}

或者您可以专门查找SyntaxError:

try {
  JSON.parse('<html></html>');
} catch (e) {
  if (e instanceof SyntaxError) {
    console.log("I caught a pesky SyntaxError! I'll handle it specifically here.");
  } else {
    console.log("I caught an error, but it wasn't a SyntaxError. I handle all non-SyntaxErrors here.");
  }
}

Mozilla有更多info on JS errors and handling them

答案 4 :(得分:0)

如果您只是想确保编写语法上有效的JavaScript,我不能强烈推荐 JSLint JSHint

  1. Learn itUse it.
  2. 成为更好的JavaScript程序员。
  3. ???
  4. 利润!

答案 5 :(得分:0)

由于语法分析器抛出了语法错误,因此您特别无法捕获语法生成的SyntaxError,这不知道try / catch块的作用。有关更多信息-Learning how programming languages work

有一种方法可以捕获在代码执行过程中生成的SyntaxError。这种方法很慢,我不推荐使用。您可以使用eval()捕获SyntaxErrors。

var code = `function() {
doSomething()
somethingElse()
var x = 5 + 5
// No ending curly brace` // The code to be run using eval

try {
  eval(code) // Try evaluating the code
} catch (e) {
  if (e.name !== 'SyntaxError') throw e // Throw the error if it is not a SyntaxError
  
  console.log('A SyntaxError has been caught\n\nDetails:\n' + e) // It is a SyntaxError
}

或者,您可以使用new Function(),速度最高可提高93%-https://jsben.ch/1HLQ1

var code = `function() {
doSomething()
somethingElse()
var x = 5 + 5
// No ending curly brace` // The code to be run using eval

try {
  new Function([], code) // Try evaluating the code
} catch (e) {
  if (e.name !== 'SyntaxError') throw e // Throw the error if it is not a SyntaxError
  
  console.log('A SyntaxError has been caught\n\nDetails:\n' + e) // It is a SyntaxError
}