当JavaScript引擎在解析代码时遇到不符合语言语法的令牌或令牌顺序时,抛出SyntaxError。
但如果出现语法错误,程序怎么可能首先运行呢?
如何捕获JavaScript语法错误?
答案 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>
答案 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)
答案 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
}