在Angular中处理HTTP错误的最佳做法-Http拦截器或单个错误处理程序

时间:2020-01-27 11:35:50

标签: angular http rxjs

我正在讨论处理Angular应用程序中的错误的不同方法。我已经以一种方式实现了错误处理,但是我开始看到潜在的漏洞和问题,这些漏洞和问题可能是以后的问题。我考虑了另一种选择,但是我不确定哪种方法在Angular最佳实践环境中更合适。我将在下面对它们进行解释。

1)当前处理错误的第一种方式涉及在http请求订阅中使用错误处理程序。我有单独的服务来处理应用程序特定模块的http请求,并且类订阅这些http类的方法公开的可观察对象。在订阅中,我使用错误处理程序捕获错误并将错误的详细信息推送到GenericErrorService类,该类又通过UI组件可以订阅并相应采取行动的主题发出详细信息(显示带有错误详细信息的小吃店等) 。

doSomething() {
    this._httpService.doHttp$().subscribe(
      (result) => {
        //do stuff with successful result
      },
      error => {
        this._genericErrorService.emitErrorDetails(GenericErrorType.SpecificError, error.status);
      }
    );
  }

GenericErrorService将枚举作为参数来反映发生的错误的类型。这对UI组件特别有用,因为它允许检查发生了哪种类型的错误并采取适当的措施。由于此订阅错误处理程序是为特定的http请求编写的,因此我们可以确定发生的错误类型。

但是,这种处理错误的方法意味着我的服务(和其他服务)中有许多http错误处理程序,这意味着有很多代码需要维护,并且可能彼此冲突。另外,在同一时间发送并在不同时间返回的http请求之间的竞争条件意味着,由于返回的错误,此特定方法导致显示错误的UI元素闪烁,并覆盖显示在任何位置的元素时间。这段代码适用于当前应用程序,但是可扩展性是一个大问题,因此我为什么要考虑其他选择。

2)我正在考虑的另一个选项是使用HTTP拦截器类通过catchError跟踪所有传入错误,并根据收到的错误采取适当的措施。

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(request).pipe(
      catchError((error: HttpErrorResponse) => {
        //determine which error has occurred, emit error details to GenericErrorService
        return throwError(error.message);
      })
    );
  }
}

使用HTTP拦截器意味着我将拥有一个同类来处理应用程序内可能发生的所有错误,这显然意味着维护和扩展能力要大得多。但是,通过使用拦截器,我失去了每个http响应都具有一个错误处理程序所提供的特异性。由于拦截器将捕获所有错误,因此我不再能够将特定的GenericErrorType推送到GenericErrorService,而是必须进行某种检查以查看确切的错误发生,然后采取措施。那。我能想到的唯一方法是对HttpErrorResponse中保存的URL进行字符串比较,这再次使我担心在API URL更改的情况下需要维护,从而破坏了应用程序的错误处理。 / p>

这里哪个是更好的选择?

0 个答案:

没有答案