Condividi tramite


如何处理WinJS程序崩溃

我们开发程序的时候经常会遇到这样的问题,如何在WinJS程序崩溃的时候及时记录下来我们需要的错误信息, 以便我们修复程序, 发布下一个更好的版本. 

第一反应是WinJS.Log()或者普通的console.log()方法,当然, 这两个办法非常实用,具体用法网上教程很多,我们可以简单的把WinJS程序理解成一个HTML页面的调试,这里不再赘述。但不足之处在于这两个方法仅仅用于本地调试,一旦用户安装了应用之后出现了什么问题,这两个方法只能在用户本地记录错误信息,不能及时的发送给开发人员。 

我在论坛上遇到很多类似的提问, 比如开发者提到用户反映App出现了一些异常,开发者有什么办法及时获取这些异常信息?微软有考虑过这样的情况,有一个叫CEIP的计划,全称为Customer Experience Improvement Program,可以让开发者在DashBoard上获取用户运行App崩溃时候的一些异常信息,这是一个极好的工具,生成的Dump文件可以帮助分析各种出错的地方。 

但是开发者们也想自己搭建一个Server用于接收用户的错误信息,这样可以及时收集到第一手且全面的错误信息, 以便快速修复这些问题, 提高App用户的体验?通过参考WinJS大神的Blog,我们可以得出以下结论:WinJS.Application.onerror并不是导致程序立即关闭的重要因素, 而MSApp.terminateApp() 才是关闭程序的根本原因,所以我们可以在这之间抽出一段时间用于保存我们的错误信息并且发送,当然我们还可以通过改变return值来阻止程序关闭。 

Windows.Application.onerror = function (e) {

showErrorPage(e); 

return
true; //
telling WinJS that the exception was handled, don't terminate

}

 在上面这段代码中,我使用了 showErrorPage()这个办法来显示一个错误信息的页面,并且把返回值改成了Ture,这样WinJS程序就不会退出,从而给了我们收集错误信息的时间,也带给用户更好的体验。 

下面我们要谈谈什么样的错误信息数据才是我们需要的数据。很多时候论坛上大家会问如何处理bug,但是似乎又缺少了点什么东西来做处理的判断,或合理的让错误信息指引我们修复程序. 我认为一个好的机制应该是反馈一些包括:

- 操作系统版本以及补丁信息

语言版本
  • 哪个页面出问题
  • 第几行代码出问题
  • 具体问题的异常信息
  • 设备信息(曾经有一个问题是跟设备的显示屏大小有关)

仅仅当我们获取了一个完整的信息的时候,我们才可以重现用户提到的问题,或许下次用户发邮件来询问这个问题的时候,你已经能提供一个完美的解决方案了。 

最后,我们还得考虑如何把错误信息发送出去,一般来说,我会在ShowErrorPage里面把错误信息发送出去,但有可能用户是在没有网络的情况下遇到这样的问题,所以我会检查一个网络连接是否正常,仅仅当有网络的时候发送错误信息,所以错误信息会预先记录在本地。或者还有一个思路就是程序开启的时候发送错误信息,不过请注意一点:我们应当优先考虑用户流畅使用度。 

另外,建议大家使用StackTraceJS(https://stacktracejs.com/) 这个工具来收集具体的错误信息,它是一个非常有用的JS扩展库。