2017-07-13 9 views
0

Angular2フレームワークを使用して単一のページアプリケーションを作成しました。 Angular2コンポーネントを作成するためにtypescriptを使用しました。Angular2アプリケーションは、typescriptファイルで例外が発生した後に応答しなくなります

アプリケーションを実行しているとき、私は変数(x)のnull値を以下のAppComponentで取得しています。

例外が発生すると、カスタムエラーハンドラを使用してエラーを処理したにもかかわらず、次の行に進むことなくアプリケーションの実行を停止します。

アプリケーションをブロックすることなく例外をキャッチする(試行/キャッチせずに)例外があるかどうか教えてください。

エラーハンドラサービス:

import { ErrorHandler, Injectable} from '@angular/core'; 
@Injectable()  
export class CustomErrorHandler implements ErrorHandler {  
    constructor() { } 

    handleError(error) { 
    console.log('Handling the error'); 
    } 

} 

アプリケーションモジュール:

import { NgModule, ApplicationRef, ErrorHandler } from '@angular/core'; 

import { BrowserModule } from '@angular/platform-browser'; 
import { CustomErrorHandler } from './error-handler'; 
import { ServicesModule } from './services'; 
import { AppComponent } from './app.component'; 

@NgModule({ 
    declarations: [AppComponent], 
    imports: [BrowserModule], 
    bootstrap: [AppComponent], 
    providers: [ 
    { 
     provide: ErrorHandler, 
     useClass: CustomErrorHandler 
    } 
    ] 
}) 
export class AppModule { } 

アプリケーションコンポーネント:事前に

import {Component} from '@angular2/core'; 

@Component({ 
selector:'my-app', 
template:'<p>Hello {{name}}</p>' 
}); 

export class AppComponent{ 

constructor(){ 
} 

OnInit(){ 
let x:any=getDataFromServer(); //assume x got data from the server 
    let z:any= x.data.value; //error occurs if x is null 
    let name="Hello"; 
} 

} 

感謝。

+1

あなたは[私は良い質問をするにはどうすればよい?](https://stackoverflow.com/help/how-to-askを通過してください、あなたはこれまでにしようとしているどのようなコードを追加することができます)。 –

+0

@MadhuRanjanご返信ありがとうございます。サンプルコードを追加しました。私の問題の解決策があれば教えてください。 – Ashok

答えて

2

この場合、角度ライフサイクルリスナーOnInitから例外がスローされるため、角度コンポーネントの作成順序を打ち切り、アプリケーションを完全に中断します。 ErrorHandlerは、この場合は役に立ちません。ほとんどの場合、それは観測可能なエラーや未処理の約束の拒否を処理するために使用されます。

0

例外がコンポーネントで次のコードを発生した場合

@Injectable() 
class MyExceptionHandler implements ExceptionHandler { 
    constructor(private appRef:ApplicationRef) {} 
    call(error, stackTrace = null, reason = null) { 
    // do something with the exception 
    this.appRef.tick(); 
    } 
} 

ように例外ハンドラを使用して実行されず、また、変化の検出はもう起きていません。 カスタムエラーハンドラは、エラーをサーバに報告できるようにするためのものですが、例外処理を集中管理するものではありません。

アプリケーションの例外が予想される場合は、できるだけ近くで処理する必要があります。 例外がカスタムエラーハンドラに到達すると、アプリケーションが失敗したと見なすことができます。ユーザーにページをリロードして、アプリケーションを有効な状態に戻すように指示する必要があります。

上記の回避策を使用すると、アプリケーションを動作状態に戻すことができるため、ユーザーの指示を角度コードで表示できます。

も参照してくださいAngular/Angular2 data binding not working after catching Javascript error using custom errorhandler

関連する問題