【问题标题】:window.onerror doesn't work in mobile -- How should I deal with unhandled exceptions?window.onerror 在移动设备中不起作用——我应该如何处理未处理的异常?
【发布时间】:2011-10-20 09:16:26
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      我没有时间测试这个;所以我现在只能建议一个思想实验,因为老实说可能是一个坏主意...

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

      【讨论】:

      • 我认为这不是一个好的解决方案。我宁愿手动将我的代码包装在 try/catch 块中,也不愿插入代码以自动将所有事件处理程序(包括 Sencha Touch 框架事件处理程序)包装在 try/catch 块中。似乎它在性能和电池寿命方面会很昂贵,而且仍然不能完全覆盖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多