Обработка ошибок в RxJS

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

Основные подходы к обработке ошибок

  1. catchError — перехват ошибки и возвращение нового observable:
import { catchError, of } from 'rxjs';

this.http.get('/api/data').pipe(
  catchError(error => {
    console.error('Произошла ошибка', error);
    return of([]); // Возвращаем пустой массив вместо ошибки
  })
)
.subscribe(data => console.log(data));
  1. retry и retryWhen — повторная попытка выполнения запроса:
import { retry } from 'rxjs/operators';

this.http.get('/api/data').pipe(
  retry(3) // Повторить 3 раза при ошибке
)
.subscribe();
  1. throwError — создание нового потока ошибки:
import { throwError } from 'rxjs';

throwError(() => new Error('Новая ошибка')).subscribe({
  error: err => console.error(err.message)
});

Комбинация операторов для сложной обработки

Для обработки различных сценариев удобно комбинировать операторы:

import { timer } from 'rxjs';
import { mergeMap } from 'rxjs/operators';

this.http.get('/api/data').pipe(
  retryWhen(errors =>
    errors.pipe(
      mergeMap((error, i) => i < 2 ? timer(1000) : throwError(() => error))
    )
  ),
  catchError(err => {
    console.error('Ошибка после повторных попыток', err);
    return of([]);
  })
)
.subscribe();

В этом примере запрос повторяется до двух раз с задержкой в 1 секунду, после чего ошибка перехватывается и заменяется безопасным значением.

Глобальная обработка ошибок

Angular позволяет централизовать обработку ошибок через ErrorHandler или перехватчики HTTP (HttpInterceptor), что особенно полезно для логирования и отображения уведомлений пользователю:

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
  handleError(error: any): void {
    console.error('Глобальная ошибка', error);
    // Возможна интеграция с внешними сервисами логирования
  }
}

Совмещение локальной обработки через RxJS и глобальной через ErrorHandler обеспечивает надёжность и предсказуемость работы приложения, снижая риск некорректного поведения при неожиданных ошибках.