何时以及为何使用订阅的错误处理程序?

时间:2019-11-08 20:49:56

标签: javascript angular typescript

我注意到,即使我没有在我的订阅回调中包含错误处理程序,我的错误仍然会记录到控制台。看来Angular默认会将所有错误记录到控制台,在这种假设下我正确吗?

例如,如果我包括错误处理程序:

  console.log("beep");

  of(1,2,3,4).pipe(
    mergeMap(data => {
      if (data === 3) {
      return throwError('Error Occurred for data: '+ 3);
      }
      return of(data);
    })
    ).subscribe(res => console.log(res),
     err => console.error(err)
    );

   console.log("bop");

我的浏览器控制台中的输出是

beep
1
2
Error Occurred for data: 3
bop

现在,如果我在订阅中取出错误处理程序,就像这样

console.log("beep");

  of(1,2,3,4).pipe(
    mergeMap(data => {
      if (data === 3) {
      return throwError('Error Occurred for data: '+ 3);
      }
      return of(data);
    })
    ).subscribe(res => console.log(res)
    );

   console.log("bop");

我在控制台中找到了它:

Beep
1
2
Bop
ERROR Error Occurred for data: 3

是什么原因导致这种差异?我知道throwError返回一个Observable,该Observable发出错误通知,并且errorHandler(结束流生命周期?)并接收错误。因此,如果我取出errorHandler,那么成功处理函数会将throwError Observable视为值吗?

通常,我觉得没有必要对诸如HTTP和东西之类的东西进行任何类型的错误处理,因为即使我将错误处理程序从我的订阅回调中删除,Angular似乎也会通过记录404为我处理错误找不到消息等到控制台。

1 个答案:

答案 0 :(得分:0)

如果遇到HTTP错误时您要做的只是将错误消息记录到控制台,则无需订阅错误处理程序。除非可以以某种方式处理错误处理程序,否则您不应该订阅错误处理程序(或捕获异常)。

有时,您可能想做一些不同的事情。也许有一个备用服务器可以尝试。也许您想将用户重定向到其他错误页面。也许您可以仅禁用网站的一部分,其他所有内容都可以继续工作。也许该错误表示服务器繁忙,您应在30秒后重试。

在这些情况下,您将希望订阅该错误处理程序并采取措施。尽管,即使那样,您也可以使用catch运算符或其他某种机制。