Angular中模块特定的错误处理

时间:2018-02-01 13:56:32

标签: angular error-handling

我正在使用Angular中的ErrorHandler。如果我只使用一个模块,它工作正常。当我使用多个模块并希望在特定子模块中使用不同的错误处理程序时,它不起作用。只调用父错误处理程序。

RootModule
|--> provides CustomErrorHandler1
|    
|--> ChildModule1
|    |--> provides CustomErrorHandler2
|
|--> ChildModule2
     |--> provides CustomErrorHandler1

如果在ChildModule1或ChildModule2中发生错误,则错误始终由RootModule的CustomErrorHandler1实例处理。

我正在使用延迟加载来加载这些模块。提供相同服务的不同实例适用于除错误处理程序之外的所有@Injectable()。

是否可以提供这些ErrorHandler,以便每个模块中的错误将由其模块定义中提供的ErrorHandler处理?

我在github创建了一个示例存储库。它可以通过ng serve运行。如果单击“child1”,Childmodule1将抛出一个错误,如果单击“child2”,Childmodule2将抛出错误。

3 个答案:

答案 0 :(得分:2)

经过一番研究后我发现了

  

ErrorHandler =>提供集中异常处理的钩子。

所以我只注册了一个ErrorHandler来拦截所有Exceptions,然后我将错误委托给component based ErrorHandlers并处理了其中的数据。每个child组件都拥有自己的Error,并且基于instanceof我们会将错误委托给ErrorHandler内的相应component。< / p>

注意:这样做的缺点是,通过Error检查的任何error instanceof Error都会被委托给Global registered handler内的app.module.ts内部ErrorHandlers }

我也知道这种方法可能不是最好的,但是没有注册多个per component Global而是{{1}}一个然后处理的方法里面的一切。希望这可以帮助您以正确的方式解决问题。

我还更新了nikola_gavric分支,以便您可以看到我在那里做了什么

答案 1 :(得分:0)

你能分享一下模块???

的代码吗?

从你的观点来看,自从Angular路由是lazyLoaded以来它没有任何意义,在编译时创建一个注入器层次结构。这应该会产生你正在寻找的效果。

我的建议是:

  • 检查您的模块是否真的是LazyLoaded。您获得的结果与eagerLoaded App一致。
  • 检查您的提供令牌是否正确,例如您应该这样做:
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:455)

答案 2 :(得分:0)

答案是,ErrorHandling只适用于RootModules,Angular团队不愿意解决这个问题:

https://github.com/angular/angular/issues/22197