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, которые отписываются при возникновении любой ошибки. Если это так, вам может понадобиться:
- Поймать исключение в пределах
.subscribe
"sonNext
обработчик сtry...catch
вместо внутриonError
обработчик. - Переподписаться в
.subscribe
"sonError
обработчик.