問題

Angular 4アプリでグローバルエラー処理を実装する必要があります。 ErrorHandlerメカニズムで、場合によっては機能しますが、すべてでは機能しません。

たとえば、欠落しているテンプレートなどの重大なエラーが発生した場合、ErrorHandlerはそれを無視します。テンプレートに間違ったURLを使用すると、zone.jsエラーが発生します。

zone.js?fad3:567 Unhandled Promise拒否:テンプレート解析エラー: 'my-app'は既知の要素ではありません:

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 }
}
 

更新: Plnkr

  ベストアンサー

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);
  }
}
 

このようにして、両方のエラーが表示されます。

@編集:私はこの https://angular-2-training-book.rangle.io/handout/zones/ 非常に便利であることを発見しました。

  同じタグがついた質問を見る

angular