JSON.parse("") 因脚本错误而失败,但不在 try/catch 内

时间:2021-01-18 13:31:13

标签: javascript google-chrome exception

在 Chrome 上(虽然不是在 Firefox 上),

JSON.parse("")

因“脚本错误”而失败。您可以通过运行上面的脚本或运行 https://jsfiddle.net/xupf27nh/1/ 来重现它。为什么会出现脚本错误?这里没有cors活动...?

try {
    JSON.parse("")
} catch(e) {
    throw e;
}

正确打印错误消息 "message": "Uncaught SyntaxError: Unexpected end of JSON input",。为什么这次不一样?为什么不

a.b.c.d.e.f()

script error 失败但正确显示错误消息?

1 个答案:

答案 0 :(得分:5)

出于安全原因,浏览器有意隐藏源自不同来源的脚本文件的错误。在这种情况下,由于 CORS 设置,JSON.parse 返回的错误被视为不同的来源,因此被您的浏览器隐藏。

但是,当您使用 try\catch 进行封装时,您的代码会抛出错误:

try {
    JSON.parse("")
} catch(e) {
    // your browser see an error thrown from here : your code
    throw e;
}

因此,您的 chrome 浏览器无法识别来自其​​他来源的错误,这与正确显示 a.b.c.d.e.f() 错误的原因相同:它被识别为您的代码抛出的错误。

请注意,浏览器具有不同的 CORS 政策规范和实现(和错误),因此它们的行为可能与此处不同。

您可以在此处了解有关此特定脚本错误的更多信息:https://blog.sentry.io/2016/05/17/what-is-script-error