2016-02-06 2 views
24

Как определить Угловое, чтобы не блокировать все приложение, когда оно встречает исключение?Angular2: Application crashes/перестает отвечать после возникновения ошибки/исключения

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

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

Я знаю, что в Javascript

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

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

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

+0

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

ответ

12

На угловой 2 окончательной версии вы можете реализовать пользовательский 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

обновление 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

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

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

+3

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

+0

Я предполагаю, что нет другого пути, кроме как поймать исключение раньше. Исключительные пузыри до Angular и Angular не имеют способа узнать, как обращаться с вашей пользовательской «ошибкой». Он запускает обработчик исключений и выходы. –

+0

Ну, если это так. Я не знаю, должен ли я принимать ответ, чтобы помочь другим, так как я не очень хорошо знаком с правилами SO. BTW, чтобы заставить решение работать, нужно какое-то редактирование, которое я бы хотел. –

3

Я пытался реализовать пользовательский обработчик исключений в соответствии с указаниями @ GünterZöchbauer

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


Bootstrap приложения с 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

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

+1

Да, в 'logGroupEnd() {if (this.res.length) {' Я должен делать 'window.location.href = '/'' или какой-то другой путь defaullt –

+1

Ankit, @ GünterZöchbauer Я также сталкиваюсь с такой же проблема. Но, я думаю, это не очень хорошее решение, так как если пользователь использует спа-центр, и вдруг появляются некоторые исключения js, страница будет перезагружена и перенаправлена ​​на другую страницу. Пользователь не сможет понять, что это такое. Так вы нашли какой-то другой способ? – monica

2

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

  1. поймать исключение в onNext обработчика .subscribe «s с try...catch вместо внутри onError обработчика.
  2. Подпишитесь на .subscribeonError обработчик.
+0

Как получить доступ к этому обработчику onNext. Не могли бы вы объяснить синтаксис? – jackOfAll

+0

@jackOfAll Конечно. Когда у вас есть объект Observable, вы можете вызвать на нем метод 'subscribe', т. Е .:' observable.subscribe (myHandler) '. 'subscribe' метод фактически принимает 3 аргумента. Первый называется 'onNext', 2nd -' onError' и 3rd - 'onCompleted'. Вы можете увидеть больше здесь: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/subscribe.md. Не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы или если мой ответ не охватывает то, что вы имели в виду :) –

+0

Спасибо Michal. Я попытался обернуть весь метод подписки в блок catch try. Я также попытался разместить код с каждым аргументом обратного вызова (onNext и onError, я не изучал onCompleted) в блоках try catch. Но в каждом случае я не мог поймать исключения! В моем случае авария происходит, когда я получаю 404 ответ от моего API, и я заканчиваю обратный вызов onError – jackOfAll

Смежные вопросы