Подтвердить что ты не робот

Приложение перестает отвечать на запросы после исключения

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

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

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

Я знаю что в JavaScript

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

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

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

4b9b3361

Ответ 1

В финальной версии Angular 2 вы можете реализовать собственный ErrorHandler (пример документации 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 {}

Ответ 2

ОБНОВИТЬ:

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

Смотрите также это.

ОРИГИНАЛ:

Реализуйте пользовательский обработчик исключений:

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

Смотрите также это и это.

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

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

Ответ 3

Я попытался реализовать 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})])

Ответ 4

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

  • Захват исключения в обработчике .subscribe onNext с try...catch вместо внутреннего обработчика onError.
  • Подпишитесь в обработчике .subscribe onError.