5

我正在使用 捕获应用程序中的 js 错误window.onerror,但问题是 - 在 Chrome 中,如果未打开开发工具 - 那么url传递给onerror处理程序的参数始终等于打开的 url。

而如果打开开发工具 - 那么url指向确切.js文件的点会导致 js 错误。

你如何解决?有什么解决方法吗?

更清楚的是 - 这里有 2 个结果:

  1. Uncaught ReferenceError: a is not defined index:122- 这是在获取页面后收到的
  2. Uncaught ReferenceError: a is not defined List.js:122- 这是在打开开发工具的情况下获取同一页面后收到的。这是预期的结果 - 我已a();调用List.js文件进行测试。

UPD:这是为功能测试(使用 selenium webdriver)而完成的 - 我想捕获 js 错误以进行进一步调查。

4

2 回答 2

1

更多的东西可以尝试回答,但它可能会有所帮助。

Chrome 最近添加chrome://inspect/到了方便的 URL 列表中(请参阅chrome://chrome-urls/完整列表)。不幸的是,我找不到我读到的关于此的推文或博客文章,但我认为它是在上个月内。该 URL 肯定适用于 Chrome 28。

chrome://inspect/列出所有打开的选项卡,并带有一个检查链接,该链接重定向回现有的打开页面,但也会打开 DevTools。

我认为 selenium 测试可以在一个选项卡中打开被测站点,并在第二个选项卡中打开检查页面,按照inspect链接返回测试页面,但这次打开 DevTools,允许window.onerror捕获更好的错误。

就像是:

document.getElementsByClassName('row')[n].getElementsByTagName('a')[0].click()
于 2013-04-10T22:05:00.140 回答
1

让我们提出以下架构:

window.addEventListener("error", handleException, false);

function handleException(I_sMsg) {

    if (I_sMsg.stack) {
            sMsg = I_sMsg.stack.replaceAll(getBaseURL(), "");
        alert(sMsg);
    } else if (I_sMsg.message) {
        alert(I_sMsg.message);
    }   

    return cancelEvent(I_sMsg);
} 

现在 anythrow new Error("description");将通过 if 语句的第一部分,并有一个很好的堆栈供您使用 url 解析。

它也适用于意外异常,因此会出现以下消息(在这种情况下,在调用不存在的bibi()函数之后)

意外异常的屏幕截图

经过进一步调查,我的框架正在使用某种自制的作业管理(实际上如堆栈中所示),其中每个操作都属于一个作业。

作业执行方式如下(简化)

    try {
        oTask.func.apply(oTask.obj, oTask.prms);
    } catch(ex) {
        handleException(ex);
        return false;
    }

所以这意味着每一次执行都被封装在这个单一的 try catch 块中。如您所见,异常被捕获并传递给处理程序。不是错误

我虽然它在另一个文件中工作,但这是因为调用被封装,而直接在 api.js 文件中它是一个不受框架管理的免费调用。

于 2013-04-10T22:12:15.257 回答