错误处理程序和 RxJS 6.2.2

Wal*_*cht 5 rxjs angular angular6 angular-errorhandler rxjs6

我有一个带有 globalError 处理程序的应用程序,如下所示:

import { Injectable, ErrorHandler, Injector } from "@angular/core";
import { Router } from "@angular/router";

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

  constructor(
    private injector: Injector) { }


  public handleError(error: any) {
    console.error("Something went wrong");
    //.. Handle error here
  }
}
Run Code Online (Sandbox Code Playgroud)

这总是适用于每个星座。如果抛出错误,全局处理程序会捕获并处理它。

现在升级到 RxJs 6.2.2 后,我明白捕捉 http 错误发生了变化。

代码错误仍然有效,但 HttpClient 抛出的错误不会被全局捕获。GlobalErrorHandler 不再被触发。

我知道我可以处理我的服务中的错误,并且工作正常:

doSomething() {
    return this.http
      .get("http://someURL").pipe(
      map((res: any) => { console.log(res) }),
        catchError(this.handleError<any>(`blabla`))
      );
  }

  /**
 * Handle Http operation that failed.
 * Let the app continue.
 * @param operation - name of the operation that failed
 * @param result - optional value to return as the observable result
 */
  private handleError<T>(operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {
      console.log("Now throwing error");
      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead
      // Let the app keep running by returning an empty result.
      // ToDo: Global Error handler hier aufrufen....
      return of(result as T);
    };
  }
Run Code Online (Sandbox Code Playgroud)

但我实际上想集中处理所有错误。

Angular 6 和 RxJs 6 集中处理错误的正确方法是什么?

Jan*_*ker 3

嗯,你尝试过吗?在我当前的 Angular 6 应用程序中,当没有其他人捕获错误的 HTTP 结果时,将调用全局 ErrorHandler。然后事件遍历整个流,进入订阅回调,没有找到错误函数,然后直接进入全局错误处理。

\n\n

所以对我来说效果很好。(角度 6.0.9、RXJS 6.2.1)

\n\n

我个人真的很喜欢在大多数时间使用特定的 rxjs 错误捕获。\n它允许特定的响应。对于某些 HTTP 错误,我想尝试重试,对于某些错误,可以使用默认值,而对于某些错误,我必须举起红旗,让应用程序美丽地死去。

\n\n

最好的是,您可以在调用附近捕获错误并进行处理(例如重试或返回默认值),并且订阅者甚至希望意识到有一个错误处理处于活动状态。

\n\n

I\xc2\xb4m 使用全局 ErrorHandler 和 it\xc2\xb4s catchAll 逻辑大多仅作为最后一道防线。

\n\n

温暖的问候

\n