2011-08-04 46 views
13

我正在研究一个用Sencha Touch和PhoneGap编写的复杂网络应用程序。 Sencha Touch应用程序的编写方式使得很难用try/catch来包围每个潜在的故障点,尤其是使用异步AJAX请求处理程序。window.onerror在手机中不起作用 - 我应该如何处理未处理的异常?

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

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

回答

1

这是一个很好的问题。当然,窗口error事件不应该取代策略性地放置try/catch块或者很好地利用来自HTTP请求的错误响应,但是直到移动浏览器赶上桌面版本,报告真正意想不到的错误几乎是不可能的。

我没有时间测试这个;因此,所有我可以建议是一个思想实验此刻什么是所有诚实大概坏主意 ...

你可能会写替换功能addEventListener(也许dispatchMethod)是可以换的原生功能/处理程序参数与try/catch并调用自定义全局错误记录器。由于没有简单的方法可以一次性“钩住”这些函数,所以无疑将意味着迭代window上的许多本机对象的原型来执行“包装”。这可能会涵盖目前无声的大多数例外情况。

+0

我不认为这是一个很好的解决方案。我宁愿将代码手动包装在try/catch块中,而不是插入代码以自动将所有事件处理程序(包括Sencha Touch框架事件处理程序)包装在try/catch块中。似乎它在性能和电池寿命上会很昂贵,而且还不能给我全面的覆盖。 –

0

我认为安全地包装所有相关的处理程序并不昂贵。很有可能你(或Sencha Touch)已经依靠jQuery之类的东西来建立你的事件处理程序,以最平台的方式。所以一切都是由少数功能建立的,所以只有少数地方需要修补。

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

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