¿Cómo decirle a Angular 2 que no bloquee toda la aplicación cuando encuentra una excepción?
No estoy seguro de si es posible, porque Google no me iluminó sobre esto. Pero parece fundamental para cualquier aplicación web de una sola página.
Cada vez que Angular 2 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 de angular 2, puede implementar ErrorHandler personalizado ( ejemplo de documentos de Angular 2 ):
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 {}ACTUALIZAR:
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 {}Véase también esto .
ORIGINAL:
Implemente un controlador de excepciones personalizado :
@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 {}No 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 debería ser posible recargar la página automáticamente.
Por lo general, una excepción debe manejarse lo más cerca posible de la causa cuando hay una manera de recuperarse.
Traté de implementar el controlador de excepciones personalizado según las indicaciones de @GünterZöchbauer
y esto funcionó para mí
Inicia tu 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})])