Приложение перестает отвечать на запросы после исключения
Как сказать Angular 2 не блокировать все приложение, когда оно встречает исключение?
Я не уверен, если это вообще возможно, потому что Google не просветил меня об этом. Но это кажется критическим для любого одностраничного веб-приложения.
Всякий раз, когда Angular 2 встречает исключение и выдает ошибку, полное приложение перестает отвечать на запросы.
Я знаю что в JavaScript
try {
doSomething();
}
catch(err) {
handleErrors(err);
}
может решить проблему.
Но я просто хочу знать, есть ли какое-либо конкретное решение для Angular или обходной путь?
Ответы
Ответ 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
.