Angular HttpClient 错误处理困难

And*_*dle 1 error-handling json httpclient angular

新 HttpClient https://angular.io/guide/http上的 Angular 文档 有一个“获取错误详细信息”部分,其中显示了如下示例。我已修改注释以记录我的观察结果,哪些基本错误类最终出现在何处。

http
.get<ItemsResponse>('/api/items')
.subscribe(
  data => {...},
  (err: HttpErrorResponse) => {
    if (err.error instanceof Error) {
      // we never seem to get here
      console.log('An error occurred:', err.error.message);
    } else {
      // no network connection, HTTP404, HTTP500, HTTP200 & invalid JSON
      console.log(`Backend returned code ${err.status}, body was: ${err.error}`);
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

因此,至少 3 个完全不同类别的错误(网络、http、响应解析)出现在单个通道中,对于每种类型,必须在 HttpErrorResponse 的另一部分中搜索实际原因。

一个人只能识别一类,即通过标准错误代码的 HTTP 错误。但是另外两种呢?

当我拔下网络插头时,我得到了非常明显的 err.message = "Http failure response for (unknown url): 0 Unknown Error。" 描述性很强。

当新的内部 JSON 解析失败时,它表示存在语法错误 - 但不是在什么位置/字符(由 JSON.parse() 返回)。另见此处

超时等其他错误呢?

我在哪里可以找到这方面的文档?有没有人想出一种方法来普遍分析这一点,以便向用户提供有意义的信息?

Angular 5.2 in Chrome on Win,后端:ASP.NET4.6.1 pure IHttpHandler

epp*_*lon 5

我不得不查看Angular 源代码以了解可能的错误情况。错误对象将始终是 a HttpErrorResponse,但其error属性可能因情况而异。下面是使用默认的时候会发生什么XHRBackend用默认responseType'json'

收到的响应带有指示错误的 HTTP 状态代码(不是 200-299):

HttpErrorResponse.error将是解析为 JSON 的正文,或者如果解析失败,则正文为文本。

收到的响应具有良好的 HTTP 状态代码 (200-299),但正文无法解析为 JSON:

HttpErrorResponse.error将是一个类型为HttpJsonParseError具有两个属性的对象:

  • error:解析错误(类型Error
  • text: 正文

由于 XHR 网络错误,未收到响应:

HttpErrorResponse.error将是ProgressEvent类型设置为'error'. (ErrorEvent在旧版本的 TypeScript 中,它可能被错误地输入为 an 。)


注意:Angular 在发出请求时不会设置超时,也不会注册超时事件处理程序。默认的 XHR 超时为 0,因此请求永远不会在客户端超时。