【问题标题】:How are exceptions handled by the browser?浏览器如何处理异常?
【发布时间】:2020-03-20 17:03:49
【问题描述】:

我决定用一行代码搞清楚浏览器是如何处理脚本的,这一行是个例外。

假设我们有这个例外:

throw Error("custom error");

通过规范 ecma262 ThrowStatement 返回一个抛出类型的完成记录。 当脚本ScriptEvaluation被执行时:

  1. 如果 result.[[Type]] 是正常的,那么
    • 将 result 设置为 scriptBody 的评估结果。

  1. 返回完成(结果)。

这让我们很清楚,从ScriptEvaluation返回了一个throw类型的完成记录

但是 ecma262 规范没有说明何时向控制台抛出错误。我需要帮助来了解 whatwg 规范如何拦截来自 ecma262 的错误抛出。

【问题讨论】:

  • 我不认为这是标准化的,但是可以在这里找到评估脚本的步骤:html.spec.whatwg.org/multipage/webappapis.html#calling-scripts
  • @FelixKling 感谢该链接。你能告诉我重新抛出错误是什么意思吗?
  • @MaximPro 那里的规范说“可选的 rethrow errors boolean:”。它是函数的布尔参数。 rethrow 表示错误将作为错误进一步向上传递调用堆栈。
  • @loganfsmyth 因此对于我的行没有重新抛出参数。这个论点会出现在什么代码中?
  • "因此对于我的行没有 rethrow 参数" 对不起,我不知道那是什么意思。 “这个论点可以在什么代码中出现?”请花时间查看链接的规范。如果您点击使用该函数的链接,其中一个直接转到html.spec.whatwg.org/multipage/…,其中指出“运行经典脚本脚本,将重新抛出错误参数设置为 true”。所以答案是importScripts() 将错误抛出到调用它的任何代码中。这可能会在以后记录它,但也可能会捕获。

标签: html ecmascript-6


【解决方案1】:

您看到的行为是在 WHATWG HTML 标准中指定的(重点是我的)。

https://html.spec.whatwg.org/multipage/webappapis.html#calling-scripts

  1. 否则,将evaluationStatus 设置为ScriptEvaluation(脚本的记录)。 如果由于用户代理中止正在运行的脚本而导致 ScriptEvaluation 未完成,请将 evaluationStatus 保留为 null。

  2. 如果evaluationStatus是突然完成,那么:

    1. ...

    2. ...

    3. 否则,重新抛出错误是错误的。执行以下步骤:

      1. 报告由评估状态给出的异常。[[Value]] 用于脚本。

      2. 使用设置运行脚本后清理。

      3. 返回评估状态。

https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors-in-documents

当用户代理要报告异常E时,用户代理必须报告相关脚本的错误,在包含脚本的资源中出现问题的位置(行号和列号),使用由脚本的设置对象作为目标。如果在此之后仍然没有处理错误,则可能会将错误报告给开发者控制台。

另外,ECMAScript 实际上没有控制台,它在https://console.spec.whatwg.org 中指定

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多