Angular 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、响应解析)出现在一个通道上,对于每种类型,必须在 HttpErrorResponse 的另一部分搜索实际原因。

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

当我拔下网络插头时,我收到非常有说服力的err.message ="(未知网址)的HTTP失败响应:0未知错误。非常具有描述性。

当新的内部 JSON 解析失败时,它说存在语法错误 - 但不是在哪个位置/字符(由 JSON.parse() 返回)。另请参阅此处

超时等其他错误呢?

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

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

我必须查看Angular源代码以了解可能的错误条件。错误对象将始终是一个HttpErrorResponse,但其error属性可能因情况而异。以下是使用默认XHRBackend和默认responseType'json'时可能发生的情况:

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

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

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

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

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

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

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


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

最新更新