Angular2: приложение аварийно завершает работу / перестает отвечать на запросы после возникновения исключения / ошибки

Как сказать Angular не блокировать целое приложение, когда оно встречает исключение?

Я не уверен, если это вообще возможно, потому что Google не просветил меня об этом. Но это кажется критическим для любого одностраничного веб-приложения.

Angular работает быстро, и все, кроме случаев, когда он встречает исключение и выдает ошибку, полное приложение перестает отвечать на запросы.

Я знаю, что в Javascript

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

может решить проблему.

Но я просто хочу знать, есть ли какое-либо конкретное решение для Angular или обходной путь?

4 ответа

Решение

В финальной версии Angular 2 вы можете реализовать собственный ErrorHandler.

Пример из угловых документов:

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

обновление 2.0.0 RC.6 изменил название с ExceptionHandler в ErrorHandler а также call в handleError

@Injectable()
class MyErrorHandler implements ErrorHandler {

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


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

Смотрите также https://angular.io/docs/ts/latest/api/core/index/ErrorHandler-class.html

оригинал

Реализуйте собственный обработчик исключений 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 {}

См. Также https://github.com/angular/angular/issues/6865 и https://github.com/angular/angular/issues/6565

Я не пробовал себя, если это позволяет приложению продолжать работу после исключения, но я думаю, что стоит попробовать. По крайней мере, автоматическая перезагрузка страницы должна быть возможной.

Как правило, исключение следует обрабатывать как можно ближе к причине, когда есть способ исправить ситуацию.

Я пытался реализовать Custom Exception Handler по указанию @GünterZöchbauer

и это сработало для меня


Загрузите ваше приложение с 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})])

Я думаю, что проблема может возникнуть при использовании RxJS Observables, которые отписываются при возникновении любой ошибки. Если это так, вам может понадобиться:

  1. Поймать исключение в пределах .subscribe"s onNext обработчик с try...catch вместо внутри onError обработчик.
  2. Переподписаться в .subscribe"s onError обработчик.
Другие вопросы по тегам