window.onerror在移动设备中不起作用 - 我应该如何处理未处理的异常?

时间:2011-08-04 21:12:53

标签: javascript exception-handling cordova sencha-touch onerror

我正在研究用Sencha Touch和PhoneGap编写的复杂Web应用程序。 Sencha Touch应用程序的编写方式使得很难用try / catch包围每个潜在的故障点,特别是对于异步AJAX请求处理程序。

检测何时发生未处理的异常也非常重要,因为它看起来和感觉就像是使用PhoneGap的原生应用程序(即我们不能指望它们刷新页面并再次尝试在您定期查看的Web应用程序中浏览器)。

您能否建议如何处理这种情况?

2 个答案:

答案 0 :(得分:1)

这是一个很好的问题。当然,窗口error事件永远不应该替换战略性放置的try/catch块或者好好利用来自HTTP请求的错误响应,但是在移动浏览器赶上桌面版本之前,报告真正意外的错误就在附近不可能的。

我没有时间对此进行测试;所以我所能建议的是目前的一个思想实验,因为诚实可能是一个坏主意 ......

您可能会为addEventListener(可能是dispatchMethod)编写替换函数,这些函数可以使用try/catch包装本机函数/处理程序参数,并调用自定义全局错误记录器。由于没有简单的方法可以同时“挂钩”这些函数,因此毫无疑问意味着在window上迭代许多本机对象的原型来执行“换行”。这可以涵盖目前无声的绝大多数异常。

答案 1 :(得分:0)

我认为安全地包装所有相关处理程序并不需要昂贵。很可能你(或Sencha Touch)已经依赖jQuery这样的东西以最跨平台的方式建立你的事件处理程序。所以一切都由少数函数设置,因此只有少数地方需要修补。

换句话说,不要尝试在最低级别(每个节点的addEventListener)进行修补。修补(或编写)一些库函数,然后始终使用它们来建立事件监听器。

如果您首先加载错误捕获代码(在其他人有机会获取对相关函数的引用之前),并修补jQuery.bind和window.setTimeout,您将获得相当好的覆盖率。对于Ajax,已经有很好的钩子(比如jQuery.ajaxPrefilter),你可以通过将响应处理程序包装在闭包中来插入异常陷阱。