繁体   English   中英

JavaScript 可以捕获语法错误吗?

[英]Can syntax errors be caught in JavaScript?

MDN 状态

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

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

JavaScript 语法错误是如何被发现的?

您不能使用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 演示

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

我建议你阅读这些:

在 JS 世界中, SyntaxError 可以是运行时异常。 例如,当尝试解析非 JSON 格式的 JSON 响应时,可能会出现这种情况。 服务器可以发回多种类型的响应,因此,如果您将 HTML 正文响应发送到您的请求中,而该请求的正文中需要 JSON,您将在 JS 中得到一个SyntaxError抛出。 在这种情况下,您会收到如下所示的错误消息: 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 有更多关于 JS 错误和处理它们的信息

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

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

如果你只是想确保你写的语法有效的JavaScript,我不能推荐的JSLintJSHint足够强烈。

  1. 学习它 用它。
  2. 成为更好的JavaScript程序员。
  3. ???
  4. 利润!

您特别不能捕获解析器生成的 SyntaxErrors,因为它们是由解析器抛出的,解析器不知道 try/catch 块的作用。 更多信息 - 学习编程语言的工作原理

有一种方法可以捕获在代码执行期间生成的 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 }

暂无
暂无

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

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