为什么在Angular应用中两次调用全局错误处理程序?

JSO*_*SON 5 error-handling angular

我有这个简单的全局错误处理程序,它源自angular ErrorHandler。现在,无论错误的位置在哪里,初始处理都会进行两次,或者至少是看起来如此。我的控制台第一次记录两次相同的错误,之后再次记录为单打,如果错误仍然存​​在,为什么?

import { ErrorHandler, Injectable, Injector } from "@angular/core";
import { Router } from '@angular/router';
@Injectable()
export class ArtCoreErrorHandler implements ErrorHandler {

  constructor(private injector: Injector) { }

  handleError(error) {
    console.log(error)
    const message = error.message ? error.message : error.toString();
    if (message == 'JWT must have 3 parts') {
      router.navigate(['/']).then(
        () => alert('wrong'),
      );
      location.reload();
    }
    throw error;
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的 app module

 providers: [
    {provide: ErrorHandler, useClass: ArtCoreErrorHandler},
    MDBSpinningPreloader,
.........]
Run Code Online (Sandbox Code Playgroud)

小智 6

如果您的错误是由于 Observable 失败而引发的,例如说通过 HttpClient 的 HTTP 请求失败,则可能是您订阅了 observable 两次。多个订阅会导致多个错误,即使源 observable 只抛出一次错误。

在这个例子中:

let obs = this._http.get('https://i-do-not-exist.test').pipe(share());
obs.subscribe(() => {})
obs.subscribe(() => {})
Run Code Online (Sandbox Code Playgroud)

HTTP 请求只会运行一次,但全局错误处理程序会抛出并捕获 2 个错误。

看到这个StackBlitz