После https://angular.io/api/core/ErrorHandler я могу переопределить глобальный обработчик ошибок, чтобы делать что-то с объектом ошибки, и мне нравится, как я могу просто объявить свой собственный глобальный обработчик ошибок и импортировать его куда мне нужно.
Но с RxJS я часто использую catchError(this.handleError(my, params, go, here)).
Я хотел бы глобализировать свой метод handleError() и включить его в свой глобальный обработчик ошибок. Но не похоже, что это технически возможно.
Это то, что делает мой метод handleError, который в сочетании с catchError RxJS обрабатывает ошибку, (1) регистрируя ее в регистраторе (2) записывая ее в консоль и (3) возвращая фиктивный Observable, чтобы вызов RxJS мог завершиться гладко .
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(private messageService: MessageService) { }
public handleError<T>(
error: HttpErrorResponse, operation = 'operation', result?: T) {
var errorMessage = '';
if (error.error instanceof ProgressEvent) {
errorMessage = `Client error occurred: ${error.message}`;
} else {
errorMessage = `Adam's error ${error.status}: ${error.message}`;
}
console.error(errorMessage);
this.messageService.add(`${operation} failed: ${errorMessage}`);
return of(result as T);
}
}
Как я могу сделать это как глобальный обработчик ошибок? Или я должен использовать другой подход? Я знаю, что мог бы создать "служба ошибок" для хранения моего универсального handleError() и внедрить его везде, как любой другой сервис, но это кажется неуклюжим.





Если вы можете вывести свои классы из контекста Angular, вы можете создать собственный оператор для RxJS. На самом деле это не решение вашей проблемы, а скорее обходной путь: используйте его в крайнем случае, если никто другой не предлагает решения:
export function handleCustomError<T>(...args) {
// Out of Angular's context, you should not have a dependency in your constructor
const errorHandler = new GlobalErrorHandler();
return catchError<T>(errorHandler.handleError(...args));
}
Во-первых, метод handleError возвращает void. Здесь вы хотите вернуть Observable, используя метод().
Во-вторых, вы должны принять во внимание, что метод handleError в GlobalErrorHandler будет выполняться не только для HttpErrorResponse, но и для любой ошибки, возникшей в вашем приложении (например, деление на ноль). Зачем return и Observable, когда в вашем приложении происходит деление на ноль или любая другая непредвиденная ошибка?
Я думаю, что ваш подход неверен. Если вы хотите поймать ошибку (и я предполагаю), поступающую с вашего API-сервера, просто для того, чтобы зарегистрировать ее и вернуть значение по умолчанию, чтобы ваше приложение не сломалось или что-то еще, я бы использовал http-interceptor. Там можно отловить любую ошибку, выполнить какие-то действия (логирование) и снова передать кастомное значение в цепочку.
Логирование с помощью перехватчиков http
Дайте знать, как все прошло. В противном случае я могу дать больше указаний.
Лучший, Максимум.