Обработка ошибок — критически важная часть работы с Observable. Рассмотрим различные подходы и лучшие практики.
Самый простой способ — обработка во втором аргументе subscribe:
someObservable.subscribe(
data => console.log('Данные:', data),
error => console.error('Ошибка:', error)
);
Особенности:
Позволяет перехватить ошибку и продолжить поток:
import { catchError } from 'rxjs/operators';
someObservable.pipe(
catchError(error => {
console.error('Ошибка:', error);
// Возвращаем fallback значение или новый Observable
return of({ fallback: true });
})
).subscribe(data => console.log('Результат:', data));
Ключевые моменты:
Операторы для повторных попыток:
import { retry } from 'rxjs/operators';
someObservable.pipe(
retry(3) // 3 попытки перед ошибкой
).subscribe(...);
import { retryWhen, delay, take } from 'rxjs/operators';
someObservable.pipe(
retryWhen(errors => errors.pipe(
delay(1000), // задержка 1 сек
take(3) // максимум 3 попытки
)
).subscribe(...);
Для централизованной обработки можно использовать:
import { ErrorHandler } from '@angular/core';
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
handleError(error: any) {
// Логирование, отправка в сервис мониторинга и т.д.
console.error('Global error:', error);
}
}
И зарегистрировать в провайдерах модуля:
{ provide: ErrorHandler, useClass: GlobalErrorHandler }
Специфические подходы для HTTP:
this.http.get('/api/data').pipe(
catchError(error => {
if (error.status === 404) {
return of(null); // Обработка 404
}
if (error.status === 500) {
// Логирование и перенаправление
this.router.navigate(['/error']);
return throwError(error);
}
return throwError(error);
})
).subscribe(...);
import { tap } from 'rxjs/operators';
someObservable.pipe(
tap({
next: () => {},
error: (err) => console.error('Ошибка в tap:', err)
})
).subscribe(...);
import { finalize } from 'rxjs/operators';
someObservable.pipe(
finalize(() => {
// Выполнится в любом случае - при успехе или ошибке
this.loading = false;
})
).subscribe(...);
Основные способы обработки:
Правильная обработка ошибок делает приложение: