JavaScript中是否可以捕获语法错误?

JavaScript中是否可以捕获语法错误?,javascript,Javascript,: 当JavaScript引擎在解析代码时遇到不符合语言语法的标记或标记顺序时,将抛出SyntaxError 但是如果有语法错误,程序一开始怎么能运行呢 JavaScript语法错误怎么可能被捕获?try-catch可以捕获的是运行时错误,而不是语法错误(如果你eval你的代码你可以处理evaled代码中的语法错误,但这很奇怪) 我建议您阅读以下内容: 您可以捕获程序员生成的异常和运行时异常,但无法捕获JavaScript语法错误,尽管您可以在某些浏览器中使用window.onerror来

:

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

但是如果有语法错误,程序一开始怎么能运行呢


JavaScript语法错误怎么可能被捕获?

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

我建议您阅读以下内容:

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


这是从托马斯·鲍威尔(Thomas Powell)的《JavaScript》一书中摘取的,我非常喜欢这本书。你可以参考那本书中的代码示例

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

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

例如:

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

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

window.onerror=函数(e){
log('Error:',e);
};
console.log('a');
这将有助于:

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

window.onerror=函数(e){
log('Error:',e);
};
console.log('a');

在JS世界中,SyntaxError可能是运行时异常。例如,当试图解析非JSON格式的JSON响应时,可能会出现这种情况。服务器可以发回许多类型的响应,因此如果您向请求发送一个HTML正文响应,而该请求正文中需要JSON,那么JS中将抛出一个
SyntaxError
。在这种情况下,您将得到一条类似以下内容的错误消息:
SyntaxError:JSON Parse error:unrecogned token'您无法捕获解析器生成的语法错误,因为它们是由解析器抛出的,而解析器不知道try/catch块会做什么。更多关于这方面的信息-

有一种方法可以捕获代码执行期间生成的语法错误。这种方法很慢,我不推荐。您可以使用
eval()
捕获语法错误

var code=`function(){
doSomething()
somethingElse()
var x=5+5
//无结尾大括号`//要使用eval运行的代码
试一试{
eval(code)//尝试计算代码
}捕获(e){
if(e.name!=='SyntaxError')抛出e//如果不是SyntaxError,则抛出错误
console.log('捕获到一个语法错误\n\n详细信息:\n'+e)//它是一个语法错误

}
+1关于将代码转换为existance并捕获可能出现的语法错误的异常,但不可靠。您有代码示例吗?您指的是哪些浏览器?相关:是的。我认为这确实是一个令人困惑的名称。从语言意义上讲,这并不是一个真正的语法错误(例如:你用引号开始了一个字符串,但在任何地方都没有结束引号等)。后者确实无法被捕获。
SyntaxError
实际上只是一个运行时错误。它只是有一个令人困惑的名称。
try {
  JSON.parse('<html></html>');
} catch (e) {
  console.log("I catch & handle all errors the same way.");
}
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.");
  }
}