Я хочу создать обобщенный c обработчик ошибок для стороны сервера и клиента. Я столкнулся с проблемой; когда метод перехватывает ошибку, я не хочу ее перехватывать. Я использую ErrorHandler для обработки глобального события, я бы использовал его также для ошибок http-вызовов, но он не обрабатывает асинхронные вызовы, фактически он ожидает выполнения действия, а затем обрабатывает ошибку. Поэтому я использую HttpInterceptor для этого, и проблема здесь перехватывает уже обнаруженные ошибки, поэтому сообщение отображается дважды.
@Injectable()
export class ServerErrorInterceptor implements HttpInterceptor {
constructor(private readonly injector: Injector) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
retry(1),
catchError((error: HttpErrorResponse) => {
const errorService = this.injector.get(ErrorService);
const exceptionHandlerService = this.injector.get(ExceptionHandlerService);
let errorMessage = '';
// server-side error
errorMessage = errorService.getServerMessage(error);
exceptionHandlerService.handleError(error, 'server side', errorMessage);
return throwError(error);
})
);
}
}
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(private injector: Injector) {
}
handleError(error): void {
let message: string;
const errorService = this.injector.get(ErrorService);
const exceptionHandlerService = this.injector.get(ExceptionHandlerService);
if (error.error instanceof ErrorEvent) {
// Client Error
message = errorService.getClientMessage(error);
exceptionHandlerService.handleError(error, 'client handler', message);
}
}
}
providers: [
{
provide: ErrorHandler,
useClass: GlobalErrorHandler
},
{
provide: HTTP_INTERCEPTORS,
useClass: ServerErrorInterceptor, multi: true
},
]