【问题标题】:Angular - When to handle errors in Observable's subscriptionAngular - 何时处理 Observable 订阅中的错误
【发布时间】:2017-11-25 11:57:15
【问题描述】:

我发现自己正在使用以最新 Angular 版本编写的主题的代码并在网上搜索,我发现大多数开发人员不处理 subscription 错误。

我的问题是:我必须在什么时候处理Observable 订阅中的错误?

没有错误处理:

    this.myService.observable$.subscribe(
        (data) => {
            // do stuff with data
        }
    );

带有错误处理:

    this.myService.observable$.subscribe(
        (data) => {
            // do stuff with data
        },
        err => {
            // do stuff with error
        }
    );

我主要找到第一个版本,但是...

不处理订阅错误不是问题吗?

这不会使代码不那么可靠、可测试并且更容易失败吗?

【问题讨论】:

  • 如果您想处理错误并对错误采取一些措施,最好设置错误 Cb。
  • @YordanNikolov 是的,我确实在我的 observables 上设置了 Cb,或者至少是其中的大部分。但我的问题更多是关于良好实践以及为什么受人尊敬的开发人员似乎“不遵循”它们。也许有一种我还不知道的不同处理方式。也许它直接在 Observable 声明中处理(例如 Http 请求)
  • 对我来说,处理所有错误以通知用户,将这些错误发送到后端并跟踪它总是一个好习惯。我想到的另一个最佳实践是,使用单独的函数处理程序(函数语句)而不是 IIF。
  • @YordanNikolov 100% 与您同在。这就是我提出问题的原因,为什么不处理这些错误。也许是有原因的。

标签: javascript angular typescript error-handling


【解决方案1】:

为什么错误处理很重要click Me

现在让我们看看为什么在 Observables 中需要进行错误处理..

示例:

this.service.send(this.shareData).subscribe(() => {

      // Here you are sure that the send has shared the data sucessFully

    }, (error) => {

      /* Now If you want to handle errors Like Front End Errors and Log this
         In your backEnd DB So solve it and fix it */

      /* Example below check error type is It from frontEnd and log error through Api */

      if(error.type !== 'API') {
        this.logService.log({
          Level: 2,
          Message: 'Failed to setFromDB',
        });
      }
    });

【讨论】:

  • 我明白了。我知道为什么我们应该处理错误,但这就是为什么我不太明白为什么在大多数情况下开发人员不处理 Observable 订阅的错误。是否只与那些直接与用户交互的订阅有关?
  • 你的意思是Angular dev teamdev who use angular是哪个开发者
  • 比如说社区开发者。我关注的所有示例和主题都没有订阅的错误处理(80%)。这一定是有原因的。
  • 嗯。我认为一个好的开发人员会在创建某些功能时处理错误。您的问题的解决方案是 angular 提供了处理可观察到的错误的功能。是否使用此功能取决于您。如果您的功能需要处理错误,您应该记录...
  • 据我说,对于像用户活动这样的订阅者,您应该记录错误,因为用户是使用我们提供的服务的关键。根据用户的说法,如果他们正在使用您的服务,只有 0.5% 的人会记录错误,而其他人只是您知道他们在做什么..
【解决方案2】:

处理错误以向用户提供反馈或退回到默认行为是一种很好的做法。

例如,如果您尝试联系 REST 服务并发生通信,那么您可能想要通知用户连接问题或加载缓存数据。

或者,如果 REST 服务返回错误。例如,您的应用程序是一个预订应用程序,用户正在下订单,但一旦他提交订单,库存中就没有更多商品了。 REST 服务返回并出错,您应该向用户显示没有更多项目。

在 Angular 风格指南中的进一步说明:

数据管理的细节,例如标头、HTTP 方法、缓存、错误处理和重试逻辑,与组件和其他数据消费者无关。

这意味着您应该从服务中返回有意义的消息。

【讨论】:

  • 好的,这只是个人考虑?就像,仅用于通知用户'由于这个原因而中断'。我不知道为什么这不能说服我,我的意思是,我们应该始终将操作的结果传达给用户,但不处理代码中的错误是很奇怪的。
  • 我认为错误是在 Observable 构造中处理的,因此,在代码方面,错误是在那里处理的。然后在订阅中我们只处理反馈给最终用户。
  • 是的,错误确实是一种结果。但不处理它意味着您的应用程序中断 1 天,您甚至不知道为什么如果您的所有代码都充满订阅而没有错误处理......
  • 是的,这就是我所说的需要处理错误。不要让你的代码崩溃!
  • 很少有这样的情况。唯一的情况是,如果您的服务在内存中保存和加载数据,它是“安全的”以避免错误处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2016-05-05
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2019-01-11
  • 2018-12-12
相关资源
最近更新 更多