Angular 2/4全局错误处理

Joh*_*Doe 7 angular

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

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


    public handleError(error: any): void {
        console.log("error", error);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

错误处理程序

 providers: [
        AuthGuard,
        { provide: ErrorHandler, useClass: CommonErrorHandler }
}
Run Code Online (Sandbox Code Playgroud)

在app.module中注册:

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


    public handleError(error: any): void {
        console.log("error", error);
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD plnkr示例添加:

rze*_*lek 11

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以看到两个错误.

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