【问题标题】:How to throw a javascript error during runtime via browser (Chrome)?如何通过浏览器(Chrome)在运行时引发 javascript 错误?
【发布时间】:2021-11-28 10:56:36
【问题描述】:

我的目标:测试我的错误处理功能。

临时解决方案:有一个自定义路由:/error,其中包含故意产生致命错误的代码。

var a = undefined;
a.b.c // Breaks.

以上工作,但我不能用它来测试生产站点,因为不需要该页面。 我正在寻找一种通过浏览器对其进行测试的方法。我试着简单地添加“ throw new Error("Custom error thrown here") 到控制台。这实际上并没有在运行时破坏它。

我尝试添加断点并添加相同的代码:throw new Error("Custom error thrown here")。那也没用。

除了上述方法之外,还有其他更简单的方法吗?

我正在寻找一种只能通过浏览器完成的方法。

谢谢。

【问题讨论】:

  • 添加debug;关键字
  • @xdeepakv 不适合生产。

标签: javascript reactjs testing error-handling


【解决方案1】:

尝试这种方式在运行时捕获错误细节

try 
{
   var a = undefined;
   a.b.c // Breaks.
} 
catch ( e )
{
   alert("Error: " + e.description );
}

【讨论】:

    【解决方案2】:

    您没有明确提到应该如何以及在何处抛出错误。我假设您可以使用 JavaScript 文件的修改副本来引发错误。修改后的文件将驻留在您的计算机上,并且仅在您使用 Chrome 开发人员工具时使用。此功能称为Local Overrides。步骤如下:

    • 打开网页
    • 为该网页打开 Chrome 开发者工具
    • Sources 面板中转到Overrides 选项卡
    • 单击Select folder for overrides 并在您的计算机上选择一个文件夹
      • 网页上会出现一条警告,上面写着“DevTools 请求完全访问...”,您必须允许该警告
    • Sources 面板中转到Page 选项卡
    • 找到需要注入“抛出错误”代码的文件
    • 右键单击并选择Save for overrides

    现在您可以在计算机上或从开发人员工具中编辑文件的副本。在所需位置插入产生错误的代码。当您在打开开发者工具的情况下重新加载页面时,Chrome 将加载 JavaScript 文件的本地副本并抛出错误。以这种方式抛出的错误将包含它起源的上下文,例如调用栈。如果开发人员工具已关闭,则将使用 Live Copy。

    【讨论】:

    • 啊,我记得在很久以前读过这篇文章。绝对精彩。谢谢!
    【解决方案3】:

    将此代码添加到您的生产代码中

    window.addEventListener('err', () => {
      throw new Error('break it');
    })
    

    当你想简单地创建一个错误时

    dispatchEvent(new Event('err'))
    

    在控制台中

    【讨论】:

      【解决方案4】:

      您可以使用全局变量,该变量可从您的应用程序和调试控制台访问。

      if (window.shouldThrow) {
          throw new Error("Custom error thrown here");
      }
      

      这样您可以使用window.shouldThrow 变量打开/关闭异常抛出。

      【讨论】:

        【解决方案5】:

        您将无法通过控制台在您的应用程序中抛出错误,因为您超出了应用程序的范围。

        话虽如此,一种稍微尴尬的方法是在 javascript 文件的开头添加一个断点。

        重新加载页面,您的应用将在断点处暂停 - 然后您可以根据需要修改代码 - 例如添加 throw new Error("something...") - 并保存您的编辑。

        然后让代码运行,你会看到你的错误。

        一个缺点是如果你重新加载更改将会消失,但我相信它尽可能接近在运行时修改代码。

        【讨论】:

          【解决方案6】:

          如果我的问题是正确的,这就是如何从控制台执行此操作:

          var script_tag = document.createElement('script');
          script_tag.type = 'text/javascript';
          script_tag.text = 'throw new Error("Custom error thrown here")';
          document.body.appendChild(script_tag);
          

          或者,如果您愿意,您可以在点击时触发它:

          var script_tag = document.createElement('script');
          script_tag.type = 'text/javascript';
          script_tag.text = 'window.document.onclick = function() { throw new Error("Custom error thrown here")}';
          document.body.appendChild(script_tag);
          

          然后你点击页面上的任意位置,抛出错误;

          【讨论】:

            【解决方案7】:

            我会使用 exec 函数,它实际上接受字符串并在编译时运行代码。

            exec('a.b.c')
            

            【讨论】:

            • 我不能在运行时运行它,对吧?我所做的是通过断点注入这段代码并刷新浏览器。控制台上没有错误。
            • 明白了,基本上您在控制台中执行的操作超出了您在应用程序中处理的范围。为了处理任何错误,这意味着它应该存在于脚本中,我认为没有办法从控制台更改此脚本。因此,您可以做的是模拟您正在测试的功能并对其执行单元测试。如果它通过了测试并处理了错误,这可能意味着它也应该在生产中工作。所以我认为没有办法从生产环境的浏览器中做到这一点。
            猜你喜欢
            • 2018-02-26
            • 2018-11-18
            • 1970-01-01
            • 2017-08-06
            • 2018-08-20
            • 1970-01-01
            • 2016-09-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多