2017-07-04 13 views
1

私はすべて例外をログに記録するのに使用するErrorHandlerを持っています。&その後、一般的なエラーページにリダイレクトします。問題は、処理された例外がlifecycle hooks(またはコンストラクタ)の外部で発生した場合にのみ機能するということです。方法。 ngOnInitの例を考えてみます。ライフサイクルフックの間にエラーが発生した場合、router.navigateは機能しません

class MyErrorHandler implements ErrorHandler { 
    constructor(private injector: Injector) { } 

    handleError(error) { 
    // log error 

    var router = this.injector.get(Router); 

    router.navigate['/error']; 
    } 
} 

エラーハンドラが正しく呼び出されました。ただし、router.navigateは、コンポーネントの初期化後に例外が発生した場合にのみ機能します。

は動作しません:予想通り

import { Component, OnInit} from '@angular/core'; 
@Component({ 
    template: '' 
}) 
export class SampleComponent implements OnInit{ 
    ngOnInit() { 
    throw Error(`Boom!`); 
    } 
} 

作品:

import { Component, OnInit} from '@angular/core'; 
@Component({ 
    template: `<button (click)="handleClick()">click me</button>` 
}) 
export class SampleComponent{ 
     private handleClick(): void{ 
     throw Error(`Boom!`); 
    } 
} 

私が何かをしないのですかどのように私はこの作業を行うことができますか?私はwindows.location.hrefを使うことができると思うが、それはむしろ避けるだろう何かであるページをリロードするだろう。 MyErrorHandler

+0

私は同じ問題を抱えていますが、constuctor(){}でエラーをスローすると、予想どおりにナビゲートします。 – jonas

答えて

0

インジェクションが正しくありません。

{ 
    provide: ExceptionHandler, 
    useFactory: (router) => { 
     return new MyErrorHandler(router); 
    }, 
    deps: [Router] 
} 

app.module.ts

変更{ provide: ErrorHandler, useClass: MyErrorHandler }は、だから今、あなたは正しくルータを注入しています。私は最善の解決策のように感じるいくつかの時間後

+0

ねえ、提案のおかげで。これを試しましたが、ApplicationRefの循環依存性エラーが発生します。 ErrorHandlerでインスタンス化するサービスがうまくいくことに気づく価値はあります。ルーティングを除いて、サービスを呼び出してあらゆる種類のことを行うことができます。 – Enn

0

'window.location.href'を使用してエラーページにアプリケーションを「リダイレクト」に確かです。 &でどんな種類のエラーが起きるかわからない場合があります。アプリケーションが完全に壊れることがあります。

関連する問題