Могу ли я настроить глобальный обработчик ошибок Angular так, чтобы он принимал больше, чем просто параметр ошибки?

После 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() и внедрить его везде, как любой другой сервис, но это кажется неуклюжим.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
365
2

Ответы 2

Если вы можете вывести свои классы из контекста 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));
}

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

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

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

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

Логирование с помощью перехватчиков http

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

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

Лучший, Максимум.

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