Проблема в том, что catchError
в @Effect
будет проглотить ошибку, и она не будет распространяться обратно к ErrorHandler
.
Вы можете найти много постово том, как это сделать, но если подвести итог, то вам нужно реализовать HttpInterceptor
и использовать catchError
для обработки ошибок, отправленных обратно HttpHandler
:
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
catchError(error => {
if (error instanceof HttpErrorResponse) {
// check for internet connection
if (!navigator.onLine) {
this.showError('No internet connection');
}
// handle HTTP errors
switch (error.status) {
case 401:
// do something
break;
case 403:
// do something else
break;
default:
// default behavior
}
}
// need to rethrow so angular can catch the error
return throwError(error);
}));
}
}
Тогда, конечно, нене забудьте представить свою реализацию перехватчика ошибок, используя токен инжекции HTTP_INTERCEPTORS
в вашем AppModule:
import { HTTP_INTERCEPTORS } from '@angular/common/http';
...
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
],
Таким образом, вы можете обрабатывать ошибки, комбинируя оба ...
ErrorHandler
для ошибок на стороне клиента (javascript, angular, ...) HttpInterceptor
для HTTP-запросов
Вот хороший пост о различных способах обработки ошибок в angular:
https://blog.angularindepth.com/expecting-the-unexpected-best-practices-for-error-handling-in-angular-21c3662ef9e4