json - Angular HttpClient 错误处理困难

标签 json angular error-handling httpclient

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

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}`);
    }
  }
);

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

通过标准错误代码只能识别一类,即 HTTP 错误。但是其他两种类型呢?

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

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

那么超时等其他错误呢?

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

Win 上 Chrome 中的 Angular 5.2,后端:ASP.NET4.6.1 纯 IHttpHandler

最佳答案

我不得不看Angular source code了解可能的错误情况。错误对象将始终是 HttpErrorResponse , 但它的 error属性可能会因情况而异。以下是使用默认 XHRBackend 时可能发生的情况默认 responseType'json' :

收到的响应带有指示错误的 HTTP 状态代码(不是 200-299):
HttpErrorResponse.error将被解析为 JSON 的正文或 如果解析失败,则正文为文本。

收到带有良好 HTTP 状态代码 (200-299) 的响应,但正文无法解析为 JSON:
HttpErrorResponse.error将是一个类型为 HttpJsonParseError 的对象有两个属性:

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

  • 由于 XHR 网络错误,未收到响应:
    HttpErrorResponse.error将是 XHR ProgressEvent类型设置为 'error' . (在旧版本的 TypeScript 中,它可能被错误地输入为 ErrorEvent。)

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

    关于json - Angular HttpClient 错误处理困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311852/

    相关文章:

    javascript - 使用 mat-checkbox 看不到 Angular 复选框

    javascript - Angular 7 : ngOnInit() of the a component is getting called every time running unit test case of that component

    javascript - 如何在angular2中使用sweetalert2

    asp.net - 声明如果InnerException为null,则不显示

    python - 在Django中全局存储错误代码和消息

    json - 目前现场的 CKAN 实例是否支持 JSON-LD DCAT 格式?

    java - Android - Base 64 中的大量数据,如何处理它

    ruby-on-rails - PostgreSQL "could not identify an equality operator for type json"的 Heroku 错误

    javascript - 如何使用javascript将对象数组的重复元素合并为一个

    python - 获取错误详细信息,例如 'openerp application error details'