Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度ErrorHandler和HttpErrorResponse_Angular_Angular Http Interceptors_Angular Errorhandler - Fatal编程技术网

Angular 角度ErrorHandler和HttpErrorResponse

Angular 角度ErrorHandler和HttpErrorResponse,angular,angular-http-interceptors,angular-errorhandler,Angular,Angular Http Interceptors,Angular Errorhandler,今天,我决定进一步研究Angular应用程序的一些集中式错误报告。我使用了michaelkarén()的一篇关于Medium的伟大文章,解释了如何处理客户端和服务器端问题并记录它们 在我的示例项目中,我有一个非常简单的拦截器: export class HttpInterceptor implements NgHttpInterceptor { constructor( private auth : AuthService ) { } intercept(request :

今天,我决定进一步研究Angular应用程序的一些集中式错误报告。我使用了michaelkarén()的一篇关于Medium的伟大文章,解释了如何处理客户端和服务器端问题并记录它们

在我的示例项目中,我有一个非常简单的拦截器:

export class HttpInterceptor implements NgHttpInterceptor {
  constructor(
    private auth : AuthService
  ) { }
  intercept(request : HttpRequest<any>, next : HttpHandler) : Observable<HttpEvent<any>> {
    return next.handle(request)
      .pipe(
        retry(1),
        catchError((error : HttpErrorResponse) => {
          return throwError(error);
        })
      );
  }
}
是的,到目前为止它还不是真正的日志记录,但这不是一个问题。然而,我注意到,当使用Angular的
HttpClient
时,或者1)使用
toPromise()
方法而不是订阅,或者2)订阅响应时的错误,错误处理程序会说HttpErrorResponse的
错误实例
为false。所以

这将正确记录“服务器”:

this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
  data => console.log,
  error => console.error
)
await this.httpClient.get('foo').toPromise()
这将错误地记录“客户端”:

this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
  data => console.log,
  error => console.error
)
await this.httpClient.get('foo').toPromise()
这也会错误地记录“客户端”:

this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
  data => console.log,
  error => console.error
)
await this.httpClient.get('foo').toPromise()
由于我完全无法理解这里到底发生了什么以及为什么会出现问题,请有人帮助我正确报告HTTP错误?我正在考虑将这些错误记录在HttpInterceptor中,但是当抛出它们时,ErrorHandler会将它们作为客户端错误再次记录

我为什么要使用回调 回调的使用主要是因为所有这些调用都在各自的服务中。例如,用户服务从端点获取数据,对数据执行某些操作,然后解析承诺(或者完成观察者,不管什么)

编辑:


我已经创建了一个StackBlitz示例来说明问题:

我已经检查了您的StackBlitz示例。如果您在
httpbreaked2
中处理错误时遇到问题,请修改代码以捕获错误并将其抛出GlobalHandler-

  httpBroken2() {
    this.httpClient.get(this.randomUrl()).pipe(catchError((errors: HttpErrorResponse) => {
      // anything you want to do (i.e. modify error)
      return throwError(errors);
    })).subscribe(
      (data) => {
        alert(data);
      }
    )
  }

有点太健谈了,我希望避免整个扔它的事情再次发生,但我想这很容易:)谢谢!欢迎:)。如果您不想在发生错误时执行任何操作,则不需要捕获错误。它将在AppErrorHandler中自动处理。因此,在RXJS中,当在observable上使用catch时,它显然可以防止错误冒泡(如try{..}catch(){..}block)。了解这一点非常有用