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