2016-02-06 27 views
24

Come dire ad Angular di non bloccare l'intera applicazione quando incontra un'eccezione?Angular2: l'applicazione si arresta in modo anomalo/non risponde dopo aver rilevato un'eccezione/errore

Non sono sicuro se è possibile anche perché Google non mi ha illuminato su questo. Ma sembra fondamentale per qualsiasi applicazione web a pagina singola.

Angolare è veloce e tutto ma ogni volta che incontra un'eccezione e genera un errore, l'applicazione completa non risponde.

so che in Javascript

try { 
    doSomething(); 
} 
catch(err) { 
    handleErrors(err); 
} 

potrebbe risolvere il problema.

Ma voglio solo sapere se esiste una soluzione specifica Angolare o una soluzione alternativa?

+0

http://stackoverflow.com/questions/37836172/angular-2-doesnt-update-view-after-exception-is-thrown#answer-43796615 – yurzui

risposta

12

Nella versione angolare 2 finale, è possibile implementare personalizzato ErrorHandler.

Example From Angular docs:

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

class MyErrorHandler implements ErrorHandler { 
    handleError(error) { 
    // do something with the exception 
    } 
} 

@NgModule({ 
    providers: [{provide: ErrorHandler, useClass: MyErrorHandler}] 
}) 
class MyModule {} 
8

aggiornamento 2.0.0 RC.6 cambiato il nome da ExceptionHandler a ErrorHandler e call a handleError

@Injectable() 
class MyErrorHandler implements ErrorHandler { 

    handleError(error) { 
    // do something with the exception 
    } 
} 


@NgModule({ 
    directives: [MyApp], 
    providers: [ 
    {provide: ErrorHandler, useClass: MyErrorHandler} 
    ] 
}) 
export class AppModule {} 

Vedi anche https://angular.io/docs/ts/latest/api/core/index/ErrorHandler-class.html

originale

Implementare un gestore di eccezioni personalizzato https://angular.io/docs/ts/latest/api/core/ExceptionHandler-class.html

@Injectable() 
class MyExceptionHandler implements ExceptionHandler { 
    call(error, stackTrace = null, reason = null) { 
    // do something with the exception 
    } 
} 


@NgModule({ 
    directives: [MyApp], 
    providers: [ 
    {provide: ExceptionHandler, useClass: MyExceptionHandler} 
    ] 
}) 
export class AppModule {} 

Vedere anche https://github.com/angular/angular/issues/6865 e https://github.com/angular/angular/issues/6565

Non ho provato io stesso, se questo consente all'applicazione di continuare dopo un'eccezione ma penso che vale la pena provare. Dovrebbe essere possibile ricaricare almeno la pagina automaticamente.

Generalmente l'eccezione deve essere gestita il più vicino possibile alla causa quando c'è un modo per recuperare.

+3

ho provato e con successo reindirizzato alla homepage prona di errori, che è meglio di niente. Ma non ho trovato un modo per far reagire l'applicazione anche dopo l'eccezione, che in generale non sarebbe un buon modo, ma come ripiego potrebbe essere bello avere. –

+0

Immagino che non ci sia altro modo che catturare l'eccezione prima. L'eccezione bolle fino a Angolare e Angolare non ha modo di sapere come gestire il tuo "bug" personalizzato. Esegue il tuo gestore di eccezioni ed esce. –

+0

Bene, se questo è il caso. Non so se dovrei accettare la risposta per aiutare gli altri, dato che non ho molta familiarità con le regole SO. BTW per far funzionare la soluzione ha bisogno di alcune modifiche, cosa che vorrei fare. –

3

ho cercato di attuare gestore personalizzato di eccezione come indicato dal @ GünterZöchbauer

e questo ha funzionato per me


bootstrap l'applicazione con CustomExceptionHandler.

import {ExceptionHandler} from 'angular2/core'; 

class _ArrayLogger { 
    res = []; 

    log(s:any):void { 
    this.res.push(s); 
    } 
    logError(s:any):void { 
    this.res.push(s); 
    } 
    logGroup(s:any):void { 
    this.res.push(s); 
    } 
    logGroupEnd() { 
    if(this.res.length) { 

     //this section executes if any error is logged by angular. 

     //do your stuff here 

     /*e.g 

     if(location.pathname !== 'dashboard') { 
      window.location.href = '/dashboard'; // condition is required to prevent infinite loop 
     } 

     */ 
    } 
    }; 
} 

export class CustomExceptionHandler extends ExceptionHandler { 
    constructor() { 
    super(new _ArrayLogger(), true); 
    } 

    call(error, stackTrace = null, reason = null) { 
    super.call(error, stackTrace, reason); 
    } 
} 

bootstrap(MyApp, [provide(ExceptionHandler, {useClass: CustomExceptionHandler})]) 
+0

Suppongo tu debba ancora ricaricare tutti i componenti. Hai provato? –

+1

sì, in 'logGroupEnd() {if (this.res.length) {' Devo fare 'window.location.href = '/'' o qualche altro percorso defaullt –

+1

Ankit, @ GünterZöchbauer Sono anch'io di fronte al stesso tipo di problema. Ma, penso che questa non sia una buona soluzione dato che se un utente utilizza la spa e improvvisamente arrivano alcune eccezioni js, la pagina viene ricaricata e reindirizzata su un'altra pagina. L'utente non sarà in grado di capire cosa sta succedendo. Quindi hai trovato un altro modo per aggirare? – monica

2

Credo che il problema può verificarsi quando si utilizza RxJS osservabili, che unsubscribe quando incontrano alcun errore. Se questo è il caso per voi, potrebbe essere necessario:

  1. intercettare l'eccezione all'interno onNext gestore 's la .subscribe con try...catch invece che all'interno onError gestore.
  2. Riscriviti in .subscribe nel gestore onError.
+0

Come accedere a questo gestore onNext. Potresti elaborare la sintassi? – jackOfAll

+0

@jackOfAll Certo. Quando si dispone di un oggetto Observable, è possibile richiamare un metodo 'subscribe' su di esso, ad esempio' observable.subscribe (myHandler) '. Il metodo 'subscribe' richiede in realtà 3 argomenti. Il primo è chiamato 'onNext', 2nd -' onError' e 3rd - 'onCompleted'. Puoi vedere di più qui: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/subscribe.md. Non esitare a chiedere se hai altre domande o se la mia risposta non copre cosa intendevi :) –

+0

Grazie Michal. Ho provato a racchiudere l'intero metodo di iscrizione in un blocco catch try. Ho anche provato a inserire il codice con ogni argomento di callback (onNext e onError, non ho esplorato onCompleted) all'interno dei blocchi catch catch. Ma in ognuno dei casi non ho potuto rilevare l'eccezione! Nel mio caso l'arresto anomalo si verifica quando ottengo una risposta 404 dalla mia API e finisco nel callback onError – jackOfAll

Problemi correlati