遇到异常后,应用程序无响应

时间:2016-02-06 07:15:32

标签: angular

如何告诉Angular 2在遇到异常时不阻止整个应用程序?

我不确定它是否可能,因为谷歌并没有在这方面给我启发。 但它似乎对任何单页Web应用程序都至关重要。

每当Angular 2遇到异常并抛出错误时,整个应用程序就会无响应。

我在JavaScript中知道

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

可能会解决问题。

但我只想知道是否有任何Angular特定解决方案或解决方法?

4 个答案:

答案 0 :(得分:14)

在angular 2最终版本上,您可以实现自定义ErrorHandlerAngular 2 docs example):

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

答案 1 :(得分:9)

<强>更新

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

另见this

<强> ORIGINAL:

实施a custom exception handler

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

另请参阅thisthis

如果这允许应用程序在异常后继续,我没有尝试过自己,但我认为值得一试。 至少应该可以自动重新加载页面。

通常,当有办法恢复时,应尽可能接近原因处理异常。

答案 2 :(得分:3)

我尝试按 @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})])

答案 3 :(得分:2)

我认为当您使用RxJS Observable时可能会出现此问题,当它们遇到任何错误时会取消订阅。 如果是这种情况,您可能需要:

  1. 使用.subscribe代替onNext处理程序在try...catch的{​​{1}}处理程序中捕获异常。
  2. onError的{​​{1}}处理程序中重新订阅。