Angular ErrorHandler http错误

时间:2017-08-14 12:44:43

标签: angular typescript

我正在使用angular(4.x.x),我正在努力解决使用http请求生成的错误。

this plnkr中,我试图总结一个案例。我正在生成一些错误并尝试记录它们。当我因http调用而产生错误时,角度变化检测似乎中断,我错过了第一个http错误。

我正在使用ErrorHandler实现来拦截错误

@Injectable()
export class CustomExceptionHandler extends ErrorHandler {

  constructor(private errMsgService: ErrorMessageService) {
    super();
  }

  public handleError(err: any): void {
    let localErr = err;
    if (err.originalException) {
      localErr = err.originalException;
    }
    if (localErr instanceof CustomException) {
      console.log(`Handling CustomException`);
      // stream errors through the service
      this.errMsgService.addError(localErr);
    } else {
      super.handleError(err);
    }
  }
}

并将其记录在服务中:

@Injectable()
export class ErrorMessageService {
  private errorMessagesEmitter:ReplaySubject<CustomException> = new ReplaySubject<CustomException>();
  errorMessages = this.errorMessagesEmitter.asObservable();

  public addError(err: any) {
    this.errorMessagesEmitter.next(err);
  }
}

在plunker中,我只是在监听ErrorMessageService并打印生成的错误。当错误从Http开始时我错过了一个错误。

如果我取消app.ts第36行,我强制勾选(),错误可以正确显示。

this.errMsgService.errorMessages.subscribe(e => {
  this.errorCount++;
  this.errors.push({ 'error': e, 'count': this.errorCount});
  this.errorToConsole(e);

  // this.appRef.tick();
});

这是预期的行为吗?否则我做错了什么?

更新

观察最近的角度变化,我专注于此:[https://github.com/angular/angular/commit/a1bb9c2]。 我决定尝试在NgZone中启动我的示例错误处理,并修改了plnkr

  this.ngZone.run(() => {
    // stream errors through the service
    this.errMsgService.addError(localErr);
  });

通过这项修改,它正在发挥作用。

0 个答案:

没有答案