Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 角度HttpClient错误处理困难_Json_Angular_Error Handling_Httpclient - Fatal编程技术网

Json 角度HttpClient错误处理困难

Json 角度HttpClient错误处理困难,json,angular,error-handling,httpclient,Json,Angular,Error Handling,Httpclient,新HttpClient上的Angular文档 有一个“获取错误详细信息”部分,其中显示了如下示例。我已经修改了注释,以记录我的观察结果,基本错误类在哪里结束 http .get<ItemsResponse>('/api/items') .subscribe( data => {...}, (err: HttpErrorResponse) => { if (err.error instanceof Error) { // we never see

新HttpClient上的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}`);
    }
  }
);
http
.get(“/api/items”)
.订阅(
数据=>{…},
(错误:HttpErrorResponse)=>{
if(err.error instanceof error){
//我们似乎从未到过这里
console.log('发生错误:',err.error.message);
}否则{
//没有网络连接,HTTP404、HTTP500、HTTP200和无效JSON
log(`Backend返回代码${err.status},主体为:${err.error}`);
}
}
);
因此,至少有3种完全不同的错误类别(网络、http、响应解析)出现在单个通道中,对于每种类型,必须在HttpErrorResponse的另一部分中搜索实际原因

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

当我拔出网络插头时,我得到了非常明显的err.message=“Http失败响应(未知url):0未知错误。”非常具有描述性

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

其他错误,如超时等,情况如何

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

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

我必须查看数据库以了解可能的错误情况。错误对象将始终是
HttpErrorResponse
,但其
error
属性可能因情况而异。以下是使用默认的
XHRBackend
'json'
的默认
responseType
时可能发生的情况:

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

HttpErrorResponse.error
将主体解析为JSON如果解析失败,主体解析为文本

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

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

  • error
    :解析错误(类型为
    error
  • 文本
    :正文文本
由于XHR网络错误,未收到响应:

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



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

对不起。链接的代码仍然使用旧的Http模块。上面的链接和代码都没有区分我们有什么类型的错误——这正是我想要的。当发生简单的网络连接丢失时,此操作仍会报告“服务器返回…”-但它没有返回。关于JSON解析错误的详细信息也没有改进。请参阅问题代码中的最后一条注释。服务器上不会出现“无网络”或JSON解析错误,但会报告为“服务器返回…”这不是解决方案。谢谢eppsilon。非常详细的回答。部分原因是错误处理中的不间断性,我同时切换到了bare async。。等待fetch()并对此感到满意。
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);
}