我是Angular2的新手,并负责开发"强大的错误处理"。到目前为止,我已经按照简单的示例(console.logging)来添加自定义错误处理。但有时,如果页面由于错误而完全停止加载,我们将要重定向用户。
但有时,如下所示,尽管存在错误,否则页面会完全加载。是否只有某些类型的错误会阻止页面完全加载? One of the following 6 types perhaps?
答案 0 :(得分:2)
任何错误都可能导致您的网页无法呈现,具体取决于您在流程中的位置。如果它处于回调或其他异步操作中,则无法捕获任何错误。
小心使用"强大的错误处理等术语" - 我已经看到了大量商业项目声称这一点,但实际上只是默默地解决了大量问题,有点像on error resume next
。
我发现黄金法则是:
如果您的应用可以继续通过异常(例如从非必要服务获取损坏的JSON数据),则应始终明确处理该特定情况。
否则意外的异常应该总是破坏可见的东西。
第二条规则是反直觉的,但它确实是最好的做法。用户会抱怨他们看到的错误,可见的异常和崩溃会使他们感到不安,并降低他们对您的应用程序的信心。
然而,他们看不到的例外情况仍然发生,并且因为您已经默默地通过他们卡车了,因为仍然存在。无提示异常会导致数据丢失或损坏。它们会导致您在生产6个月后才发现的那种错误。它们会引起你可以起诉的那种错误。
如果您丢失数据并且不能立即了解错误,用户将原谅您发现的明显错误,他们会立即离开并永远不会回来。
好的,所有人都说,你似乎突出显示的错误是异步,并且与有时被描述为回调地狱的问题有关。
在屏幕截图中,错误来自HTTP GET请求 - 这通常是一种方法,您可以在其中发出AJAX请求,在成功时触发回调,但是没有回调来处理异常
Angular2使用promises,这是截图的下一个错误行。 Promise包装那些回调并允许你链接它们 - 它们真的有助于回调地狱,但它们并不是一个神奇的子弹:你必须确保每个.then()
都有一个错误处理程序或以下.catch()
。
但是,有一种更好的方法:使用Angular2,您可以使用TypeScript,这意味着您可以使用async
和await
。这些是promises的语法糖,但它们也与try
- catch
一起使用,可以更轻松地处理异步异常 。
我blogged about that in a lot more detail than I can fit here。
Angular2中的 TL; DR:使用async
/ await
(如果需要,可以使用TS转换)以确保您的Promise
和回调异常让它备份,然后处理你期望/可以解决的问题并明显地崩溃你可以做什么。