Angular2: la aplicación falla / deja de responder después de encontrar una excepción / error

¿Cómo decirle a Angular que no bloquee toda la aplicación cuando encuentra una excepción?

No estoy seguro si es posible porque Google no me iluminó sobre esto. Pero parece crítico para cualquier aplicación web de una sola página.

Angular es rápido y casi siempre que encuentra una excepción y arroja un error, la aplicación completa deja de responder.

Sé que en Javascript

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

podría resolver el problema

Pero solo quiero saber si hay alguna solución o solución alternativa específica de Angular.

En la versión final angular 2, puede implementar un ErrorHandler personalizado.

Ejemplo de documentos angulares:

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

la actualización 2.0.0 RC.6 cambió el nombre de ExceptionHandler a ErrorHandler y 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 {} 

Ver también https://angular.io/docs/ts/latest/api/core/index/ErrorHandler-class.html

original

Implemente un manejador de excepciones personalizado 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 {} 

Ver también https://github.com/angular/angular/issues/6865 y https://github.com/angular/angular/issues/6565

No me he probado si esto permite que la aplicación continúe después de una excepción, pero creo que vale la pena intentarlo. Al menos volver a cargar la página automáticamente debería ser posible.

En general, la excepción debe manejarse lo más cerca posible de la causa cuando hay una forma de recuperación.

Traté de implementar Custom Exception Handler como lo indicó @ GünterZöchbauer

y esto funcionó para mí


Bootstrap su aplicación 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 /*eg 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})]) 

Creo que el problema podría ocurrir cuando estás usando RxJS Observables, que se dan de baja cuando se encuentran con algún error. Si ese es su caso, es posible que deba:

  1. Captura la excepción dentro del controlador onNext con try...catch lugar de dentro en el controlador de onError .
  2. Vuelva a suscribirse en .subscribe en el controlador de onError .