我注意到,即使我没有在我的订阅回调中包含错误处理程序,我的错误仍然会记录到控制台。看来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为我处理错误找不到消息等到控制台。
答案 0 :(得分:0)
如果遇到HTTP错误时您要做的只是将错误消息记录到控制台,则无需订阅错误处理程序。除非可以以某种方式处理错误处理程序,否则您不应该订阅错误处理程序(或捕获异常)。
有时,您可能想做一些不同的事情。也许有一个备用服务器可以尝试。也许您想将用户重定向到其他错误页面。也许您可以仅禁用网站的一部分,其他所有内容都可以继续工作。也许该错误表示服务器繁忙,您应在30秒后重试。
在这些情况下,您将希望订阅该错误处理程序并采取措施。尽管,即使那样,您也可以使用catch
运算符或其他某种机制。