RxJS предоставляет набор операторов для управления потоками данных, где обработка ошибок играет ключевую роль в устойчивости приложений. Angular тесно интегрирован с RxJS через HTTP-клиент и сервисы, что делает корректную обработку ошибок критически важной.
import { catchError, of } from 'rxjs';
this.http.get('/api/data').pipe(
catchError(error => {
console.error('Произошла ошибка', error);
return of([]); // Возвращаем пустой массив вместо ошибки
})
)
.subscribe(data => console.log(data));
import { retry } from 'rxjs/operators';
this.http.get('/api/data').pipe(
retry(3) // Повторить 3 раза при ошибке
)
.subscribe();
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 обеспечивает надёжность и предсказуемость работы приложения, снижая риск некорректного поведения при неожиданных ошибках.