【问题标题】:Run time error handling on lazy loaded javascript?延迟加载的javascript上的运行时错误处理?
【发布时间】:2026-02-23 20:40:02
【问题描述】:

有没有人知道如何对延迟加载的 javascript 进行错误处理?我正在使用一种调用 ajax 请求并在全局范围内对代码进行评估的方法。当发生运行时错误时,它会将文件名作为我的延迟加载脚本吐出,行号是错误行加上加载脚本中我的 eval 的行号。这不会那么糟糕,除非所有的 javascript 文件都被合并到网站各个部分的模块中。围绕 javascript 文件本身的 try catch 不会捕获函数的运行时错误。有任何想法吗? Window.onerror 没有提供正确的文件名,所以它是不可能的。我需要在它被击中之前抓住它。

我在想也许我可以以编程方式在 eval'd 代码中的所有函数周围包含 try catch(这很难看),但由于它是在窗口级别完成的,我不确定如何访问 eval'd 代码具体和动态。当然,如果 javascript 是一个名为“Bob”的对象,我可以访问 window.Bob,但我需要动态进行。

【问题讨论】:

  • 也许我遗漏了一些东西,但为什么你的 JavaScript 会抛出运行时错误?就算是,也不能在调用函数之前验证函数参数吗?似乎处理运行时错误的最佳方法是不允许它们发生。
  • 并不是存在运行时错误,而是在发生错误时,我想指定为了调试目的而抛出的内容。该错误错误地表明加载脚本是问题所在。我正在寻找正确的文件名/行号。

标签: javascript exception-handling error-handling lazy-loading ondemand


【解决方案1】:

我解决了这个问题,但这不是最优雅的解决方案。基本上我所做的是:
1.站点加载后,我查看窗口中的所有对象并将它们推入一个数组。这基本上对我的代码说,忽略这些对象。

  1. 当我模块化我的代码时,我会跟踪文件的长度和放入模块中的文件名。

  2. 调制器的最后一行采用 fileLength 数组和 lineLengths 并在我的错误处理对象中调用一个函数;

  3. 错误处理代码在窗口中找到新对象。如果存在,则设置一个属性以匹配 fileLengths 和 fileNames;

  4. 递归遍历新对象并添加装饰函数以在它们周围进行尝试捕获。

  5. 当其中一个鱼钩被击中时,向上遍历并找到属性。

  6. 根据属性计算文件和行号。

  7. 根据正确的文件和行号输出新的错误;

是的,丑陋...但它有效。

【讨论】: