Angular 2/4全局错误处理

时间:2017-06-02 08:39:43

标签: javascript angular zone

我需要在angular 4 app中实现全局错误处理。 它是ErrorHandler机制,适用于某些情况,但并非适用于所有情况。 例如:当我们遇到一些严重错误,比如缺少模板或其他内容时,ErrorHandler会忽略它。当我使用错误的网址模板时,我得到Zone.js错误:

zone.js?fad3:567 Unhandled Promise rejection: Template parse errors:
'my-app' is not a known element:

Zone.js不会抛出异常,它只是控制台错误,所以window.onerror也不起作用。

错误处理程序:

@Injectable()
export class CommonErrorHandler implements ErrorHandler {
    constructor(private injector: Injector) {

    }


    public handleError(error: any): void {
        console.log("error", error);
    }
}

在app.module中注册:

 providers: [
        AuthGuard,
        { provide: ErrorHandler, useClass: CommonErrorHandler }
}

UPD plnkr示例补充说:

example

2 个答案:

答案 0 :(得分:10)

Angular使用zone.js来解析未处理的异常和拒绝: https://github.com/angular/zone.js/blob/master/dist/zone.js#L633

您需要使用NgZone服务来解析这些错误: https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html

NgZone API被标记为“实验性”,但我不知道它与现实的关系。一堆广泛使用的API仍然是“实验性的”。

示例:

import { NgZone } from '@angular/core';

@Component(...)
class AppComponent {
  constructor(protected zone: NgZone) {

    this.zone.onError.subscribe((e) => {
      console.log(e);
    });

    setTimeout(() => {
      throw new Error();
    }, 1000);

    setTimeout(() => {
      Promise.reject('unhandled');
    }, 1000);
  }
}

通过这种方式,您可以看到两个错误。

@EDIT:我发现这个https://angular-2-training-book.rangle.io/handout/zones/非常有用。

答案 1 :(得分:0)

被接受的解决方案对我不起作用,因为我的错误是在初始化时发生的(例如,一个未在模块中声明的组件),并且由于我有加载动画,所以我想停止它。

相反,我尝试将try bootstrapModule代码封装在try / catch中

  try {
    platformBrowserDynamic()
      .bootstrapModule(AppModule)
      .catch(err => {
        // Handle runtime error in angular
      });
  } catch (err) {
    // handle angular loading error here. I do that by hidding the animation div and showing the error div

    var node = document.getElementById('app-loading-error');
    if (node) {
      node.style.display = 'inherit';
    }

    var node = document.getElementById('app-loading-pending');
    if (node) {
      node.style.display = 'none';
    }

    throw err; // pass it back to the console
  }