在开发过程中,这些错误最终会出现在控制台中,其中很多不会影响我的应用程序。但是一旦我投入生产,任何小错误都会引发“这个应用程序崩溃了!” 消息,唯一的选择是重新加载。为什么 SproutCore 会突然让我的应用程序崩溃?
2 回答
Web 开发人员习惯于忽略小错误。这是合适的:由于短命网站通常需要维护最少的本地状态,许多小错误不会影响用户体验,因此修复它们所需的开发时间可能不值得。
另一方面,应用程序开发人员习惯于小心处理错误。例如,在桌面 .NET 或 Cocoa 中,操作系统会主动使抛出未处理错误的应用程序崩溃。这是因为应用程序通常假定它们是长期存在的,并且必须管理内部一致的状态。错误表明此内部状态可能已变得不受管理且不稳定,并且为了防止出现意外(或更糟糕的)行为,必须终止应用程序。
SproutCore 是用于在浏览器中使用的全功能应用程序开发框架的集合,SproutCore Web 应用程序在许多方面不同于短命、基本上无状态的网页。对本次讨论最重要的是,就其长寿命和强大的内部状态而言,它们非常适用。与桌面应用程序一样,未处理的错误表明您的 SproutCore 应用程序的内部状态可能变得不受管理且不可预测。由于 SproutCore 无法确定特定错误是良性的还是有问题的,所以它会关闭整个系统——就像其他应用程序系统一样。
SproutCore 不会在开发模式下使应用程序崩溃,以便让您有机会检查错误的原因和后果以确定如何处理它。因此,要构建健壮、稳定的 Web 应用程序,只需密切关注您的控制台,并防止或处理任何弹出的错误。
戴夫的回答很完美,但我只会添加一点技术细节:
在生产构建中,Sproutcore 将处理程序附加到浏览器的 javascript onerror 事件。通过这种方式,用户可以获得存在问题的视觉反馈,而不是让应用程序突然停止响应任何输入。
但是,在某些浏览器中,onerror 处理程序可能会阻止开发人员查看原始问题的完整堆栈跟踪。因此,在开发模式下(使用 sc-server 或类似模式),不使用处理程序,并且 Sproutcore 根本不处理异常。然后浏览器会做一些事情,比如将它记录到控制台,在那里你可以看到原来的原因。我还建议将开发人员控制台设置为“中断未捕获的异常”,以便您检查发生错误的上下文。