RxJS如何在后台捕获错误?

时间:2018-12-01 00:16:10

标签: angular rxjs

我在Angular中使用过rxjs,并且我熟悉/proc/<pid of your process>/<file of interest>流中catchError运算符的使用,尤其是对于HttpClient(XHR)调用

我的问题是pipe操作如何工作?如何在后台发现错误?

https://www.learnrxjs.io/operators/error_handling/catch.html

catchError

更新

使用“已接受答案”中的详细信息,我在StackBlitz TypeScript项目中对以下内容进行了测试。看到正在使用try / catch和Subscriber.error的好例子:

import { throwError, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
//emit error
const source = throwError('This is an error!');
//gracefully handle error, returning observable with error message
const example = source.pipe(catchError(val => of(`I caught: ${val}`)));
//output: 'I caught: This is an error'
const subscribe = example.subscribe(val => console.log(val));

1 个答案:

答案 0 :(得分:4)

catchError操作符不会像使用try / catch语句捕获异常一样直接捕获错误。

在内部,它订阅应用了源的可观察的源,并镜像源的nextcomplete通知-也就是说,这些通知不更改地流经运算符。

但是,如果操作员收到error通知,它将错误传递到提供的回调中,从而为操作员的调用者提供了处理错误的机会。

通过调用订户的error方法,可以在一种可观察的实现中实现error通知,如下所示:

const source = new Observable<string>(subscriber => {
  subscriber.error(new Error'Kaboom!'));
});

在这里,不会引发任何异常,也不需要try / catch。错误会传递给订阅者-catchError操作符订阅源,因此it's the subscriber-通过其error方法。

问题is implemented中使用throwError函数的方式。

error通知也可以通过引发异常来实现,如下所示:

const source = new Observable<string>(subscriber => {
  throw new Error('Kaboom!');
});

此处,implementation of Observable.subscribe中的try / catch语句将捕获异常,并将通过调用订阅者的error方法将错误通知传递给订阅者。 / p>

Observable和运算符实现负责捕获引发的异常。

无论是否传递了用户指定的功能-例如,在map之类的运算符中-对这些功能的调用都是wrapped in a try/catch statements,任何捕获的异常都将作为error通知传递给订阅者通过订户的error方法。