关于新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()返回)。另请参阅here
其他错误如超时等等?
我在哪里可以找到相关文档?有没有人想出一种方法来进行一般分析,以便能够给用户提供有意义的信息?
Win,Backend上Chrome中的Angular 5.2:ASP.NET4.6.1纯IHttpHandler
答案 0 :(得分:3)
我必须查看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,因此请求永远不会在客户端超时。
答案 1 :(得分:-1)
private handleError(err: HttpErrorResponse) {
let errorMessage = '';
if (err.error instanceof Error) {
// A client-side or network error occurred.
errorMessage = `An error occurred: ${err.error.message}`;
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
}
console.error(errorMessage);
return Observable.throw(errorMessage);
}