В настоящее время я использую перехватчик http для обработки всех ошибок по всему миру. Например. если ошибка http возвращается как 404, отображается перехватчик с надписью «404: страница не найдена» перехватчиком http. Это отлично подходит для обработки всех ошибок в целом, но иногда, для определенных сервисных вызовов, я знаю, что проблема в том, что элемент не найден в магазине, а сервер возвращает 404. Вместо «страница не найдена» я хочу, чтобы он вернулся «товара нет в магазине» только для этого звонка. Остальные 404 ошибки могут быть обработаны в общем.
Однако я не уверен, как это сделать, поскольку перехватчик Http идет первым до обработки ошибок в моем сервисе / компоненте.
Вот мой http перехватчик на данный момент:
@Injectable()
export class RequestInterceptor implements HttpInterceptor {
constructor(
public errorHandler: ErrorHandler,
) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).do((event: HttpEvent<any>) => {}, (err: any) => {
if (err instanceof HttpErrorResponse) {
this.errorHandler.handleError(err);
}
});
}
}
Вот мой обработчик ошибок:
@Injectable()
export class ErrorHandler {
constructor(
public snackbar: MatSnackBar, private router: Router
) {}
public handleError(err: any) {
if (err.status === 400) {
this.snackbar.open('400: There was a bad request', 'close');
} else if (err.status === 401) {
this.snackbar.open('401: Unauthorized', 'close');
} else if (err.status === 403) {
this.snackbar.open('403: Forbidden', 'close');
} else if (err.status === 404) {
this.snackbar.open('404: Page not found', 'close');
} else if (err.status === 500) {
this.router.navigate(['/error']);
} else {
this.snackbar.open(err.message, 'close');
}
}
}
И, например, вот мой сервисный звонок, я хочу, чтобы ошибка появилась первой:
getProductByNumber(storeId: number, productNum: number): Observable<any> {
this.products = this.baseUrl + '/products/' + storeId + '/' + productNum;
return this.http.get<IProduct>(this.products).catch(this.errorHandler);
}
, где
errorHandler(error: HttpErrorResponse) {
if (error.status === 404) {
this.openSnackBar('Product is not found in store');
return Observable.throw(error.message || 'Server Error');
} else {
return Observable.throw(error.message || 'Server Error');
}
}