Могу ли я настроить обработчик глобальных ошибок Angular так, чтобы он принимал нечто большее, чем просто параметр ошибки? - PullRequest
0 голосов
/ 11 февраля 2019

После https://angular.io/api/core/ErrorHandler Я могу переопределить глобальный обработчик ошибок, чтобы что-то делать с объектом ошибки, и мне нравится, как я могу просто объявить свой собственный глобальный обработчик ошибок и импортировать его в любое место, где мне это нужно.

Но в RxJS я использую catchError(this.handleError(my, params, go, here)) много.

Я бы хотел глобализировать свой метод handleError() и включить его в мой глобальный обработчик ошибок.Но это не выглядит технически возможным.

Это то, что делает мой метод handleError, который в сочетании с catchError в RxJS обрабатывает ошибку, (1) записывая ее в логгер (2) записывая ее на консоль и (3) возвращаяфиктивная Observable, чтобы вызов RxJS мог выполняться гладко.

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

  constructor(private messageService: MessageService) { }

  public handleError<T>(
    error: HttpErrorResponse, operation = 'operation', result?: T) {
    var errorMessage = '';
    if (error.error instanceof ProgressEvent) {
      errorMessage = `Client error occurred: ${error.message}`;
    } else {
      errorMessage = `Adam's error ${error.status}: ${error.message}`;
    }
    console.error(errorMessage);
    this.messageService.add(`${operation} failed: ${errorMessage}`);
    return of(result as T);
  }

}

Как я могу сделать это как глобальный обработчик ошибок?Или я должен использовать другой подход?Я знаю, что могу создать «службу ошибок» для хранения моего общего handleError() и внедрить его везде, как и любой другой сервис, но это кажется неуклюжим.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Прежде всего, метод handleError возвращает void.Здесь вы хотите вернуть Observable, используя метод ().

Во-вторых, вы должны принять во внимание, что метод handleError в GlobalErrorHandler будет выполняться не только для HttpErrorResponse, но и для любой ошибки, возникшей вваше приложение (например, деление на ноль).Зачем возвращать и наблюдать, если в вашем приложении происходит деление на ноль или любая другая непредвиденная ошибка?

Я думаю, что ваш подход не верен.Если вы хотите отловить ошибку (и я буду предполагать), исходящую с вашего API-сервера, просто для ее регистрации и возврата значения по умолчанию, чтобы ваше приложение не сломалось или что-то еще, я бы использовал http-перехватчик.Вы можете отследить любую ошибку, выполнить некоторые действия (ведение журнала) и снова передать пользовательское значение в цепочку.

Интерфейс Http-перехватчика

Вход с помощьюhttp-перехватчики

Перехват http-запросов

Сообщите mw, как все прошло.В противном случае я могу дать больше указаний.

Best, Max.

0 голосов
/ 11 февраля 2019

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

export function handleCustomError<T>(...args) {
  // Out of Angular's context, you should not have a dependency in your constructor
  const errorHandler = new GlobalErrorHandler();
  return catchError<T>(errorHandler.handleError(...args));
}
...