我认为值得分享,因为我有一个类似的问题我想...
- 仅在生产中使用我的 Sentry.io errorHandler
- 在开发中使用 Angular 默认的 ErrorHandler
- 将依赖项注入处理程序
app.error-handler.ts
第一步是实现一个工厂提供程序函数,以根据environment.production 属性返回SentryErrorHanddler 或Angular 默认ErrorHandler,并接收所需的依赖项作为参数。
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 装饰器,因为它将由上面的工厂实例化,而不是由DI).
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 相关的所有内容仅作为示例,表示您希望访问自定义处理程序的外部依赖项。