【问题标题】:JSON.parse("") fails with script error but not inside try/catchJSON.parse("") 因脚本错误而失败,但不在 try/catch 内
【发布时间】:2021-04-22 19:23:57
【问题描述】:

在 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 失败但正确显示错误消息?

【问题讨论】:

  • CORS?在 Chrome 中我得到VM28:1 Uncaught SyntaxError: Unexpected end of JSON input
  • @phybarin 我不认为他真的想解析一些东西而不是理解未捕获异常的行为。
  • 为什么你认为 CORS 和脚本错误相关?也不确定你在哪里得到脚本错误。应该是我在运行上面的示例时清楚地看到的 SyntaxError 和 ReferenceError。
  • 对于那些对这个问题感到困惑的人。第一个代码块确实在 Chromium 87.0.4280.66 i.stack.imgur.com/Jz09h.png 上产生了“脚本错误”
  • 似乎blog.sentry.io/2016/05/17/what-is-script-error 解释了为什么包装成 try catch 会使这段代码抛出正确的错误:它与 CORS 有关。但是它没有解释为什么浏览器之间的行为不同。

标签: javascript google-chrome exception


【解决方案1】:

出于安全原因,浏览器有意隐藏来自不同来源的脚本文件的错误。在这种情况下,由于 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

【讨论】:

  • 好的。但是the error returned by JSON.parse is treated as a different origin 为什么?我也在完全没有任何外来脚本的环境中看到了这种行为。为什么JSON.parse 应该以某种方式驻留在不同的来源但a.b.c.d.e.f() 不应该,这也没有意义。所以据我现在了解你,这可能只是由于一些奇怪的浏览器实现。
  • 我真的不想开始在 try/catch 中的代码中包装所有 JSON.parse() 调用(谁知道还有什么?),以避免不可读的前端错误报告。我将尝试在没有像 SO oder jsfiddle 这样复杂的包装器的情况下重现script error,然后再回到这里。谢谢
  • 我推测JSON 被识别为外部模块,因此JSON.parse 的来源不同。无论如何,一旦部署,您的问题应该会消失,该链接将为您提供其他解决方案。
猜你喜欢
  • 2018-12-03
  • 2021-12-24
  • 1970-01-01
  • 2010-12-08
  • 2013-03-14
  • 1970-01-01
  • 2015-07-05
  • 2021-03-18
  • 2021-12-08
相关资源
最近更新 更多