Обработка ошибок Angular 6 и RxJs 6 с глобальным обработчиком ошибок

У меня есть приложение с обработчиком 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
  }
}

Это всегда работало в каждой установке. Если была выдана ошибка, глобальный обработчик поймал ее и обработал.

Теперь после обновления до 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);
    };
  }

Но я на самом деле хотел бы обрабатывать все ошибки централизованно.

Как правильно использовать Angular 6 и RxJs 6 для централизованной обработки ошибок?

1 ответ

Хм ты пробовал? В моем текущем приложении Angular 6 глобальный ErrorHandler вызывается, когда никто не ловит неверный результат HTTP. Затем событие проходит через весь поток, выполняет обратный вызов подписки, не находит функцию ошибки и затем переходит непосредственно к глобальной обработке ошибок.

Так что для меня это работало нормально. (Угловой 6.0.9, RXJS 6.2.1)

Лично мне действительно нравится использовать определенную ошибку rxjs, ловящую большую часть времени. Это позволяет для конкретных ответов. Для некоторых ошибок HTTP я хочу попробовать повторить попытку, для некоторых это нормально работать со значениями по умолчанию, а для некоторых я должен поднять красный флаг и позволить приложению умереть прекрасной смертью.

Лучше всего то, что вы можете перехватить ошибку в непосредственной близости от вызова, обработать ее (например, повторить попытку или вернуть значение по умолчанию), и подписчики хотят даже понять, что обработка ошибок была активной.

Я использую глобальный ErrorHandler, и его логика catchAll в основном только в качестве последней стены защиты.

теплые пожелания

Другие вопросы по тегам