Я думал, что стоит поделиться, потому что у меня была похожая проблема, где я хотел ...
- использовать мой Sentry.io errorHandler только в производстве
- использовать Angular по умолчанию ErrorHandler в dev
- вставлять зависимости в обработчик
app.error-handler.ts
Первым шагом является реализация фабричной функции поставщика, которая возвращает либо SentryErrorHanddler
, либо значение Angular по умолчанию ErrorHandler
на основе свойства environment.production
и получение необходимой зависимости в качестве параметра.
import { ErrorHandler } from '@angular/core';
import * as Sentry from '@sentry/browser';
import { environment } from '../environments/environment';
export function errorHandlerFactory(toastService: ToastService) {
if (environment.production) {
return new SentryErrorHandler(toastService);
}
return new ErrorHandler();
}
Вторым шагом является реализация класса SentryErrorHandler
, который получит зависимость в конструкторе (обратите внимание, что я не префикс класса с @Injectable decorator, потому что он будет создан на фабрике выше, а не введен ДИ) .
export class SentryErrorHandler implements ErrorHandler {
constructor(public toastService: ToastService) {
Sentry.init({
dsn: 'https://<YOUR-SENTRY-KEY>@sentry.io/<YOUR-PROJECT-ID>',
});
}
handleError(error: any) {
Sentry.captureException(error.originalError || error);
this.toastService.show('An error occurs, please try again later.');
throw error;
}
}
app.module.ts
Наконец, в AppModule
укажите ErrorHandler
с реализованным фабричным провайдером errorHandlerFactory
и укажите, что ему нужна некоторая зависимость от внедрения через свойство deps
, которое будет передано в качестве параметра в функцию провайдера фабрики
import { ErrorHandler } from '@angular/core';
import { errorHandlerFactory } from './app.error-handler';
@NgModule({
//...
providers: [
{ provide: ErrorHandler, useFactory: errorHandlerFactory, deps: [ToastService] },
],
})
export class AppModule { }
Обратите внимание, что все, что связано с ToastService
, приведено только в качестве примера для представления внешней зависимости, к которой вы хотите обратиться в свой пользовательский обработчик.