使用try catch错误处理无法捕获错误

时间:2019-02-20 07:45:19

标签: angular

我正在构建一个具有通用POST方法的演示angular 7应用程序。虽然我可以调用此方法,但似乎没有任何错误(401,500等)被捕获在catch块中。我可以在“网络”标签中看到该帖子失败了。以下代码有什么问题?

//通用帖子方法

private async genericPostMethodAsync(url: string, options:any, body: any):Promise<any> {

try {
      const response = await this.httpClient.post(url, body, 
      options).toPromise();
      console.log(response);
      return response;
    } catch (error) {
    await this.handleError(error, this);
  }
}

private handleError(error: any, any: any): Promise<any> {
  return Promise.reject(error.message || error);
}

3 个答案:

答案 0 :(得分:1)

Rxjs 6具有一个catch运算符,可以在其site here上找到它。我相信您可以使用他们提供的方法尝试以下方法。与您使用的诺言几乎没有什么不同,但应提供您所寻找的错误捕获。

(最好在编辑后提出)

工作解决方案

使用catchError获取Http错误,然后使用of运算符确保其返回可观察到的值。在目前正在研究的小程序中进行了测试和测试,所有工作都不确定是否使用诺言。

import { Observable, of  } from 'rxjs';
import { catchError } from 'rxjs/operators';

  public genericPostMethodAsync(text: any): Observable<any> {
    return this.httpClient
      .post<any>('url', {}).pipe(catchError(val => of(
        this.handleError(val)
  )));

  }

  public handleError(val): void {
    console.log(val);
  }

首选解决方案

我更愿意做的是看在组件内的订阅函数中捕获错误。因此,在您调用该函数的组件中尝试一下。

this.exampleService.genericPostMethodAsync(url, options, body).subscribe(data => {
  console.log(data); // is good.
}, error => {
  console.log(error); // is bad.
});

在服务中使用HTTP和observable进行的主调用如下所示。

private genericPostMethodAsync(url: string, options:any, body:any):Observable<any> {
     return this.httpClient.post(url, body, options).pipe(map(data => data)
 );
}

答案 1 :(得分:0)

尝试使用管道捕获错误。
例如

getHeroes (): Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl)
.pipe(
  catchError(this.handleError('getHeroes', []))
);
}

答案 2 :(得分:0)

看来原始代码确实有效。所有错误均在catch块中捕获。解决方案非常简单,请将模块更新为最新版本(nmp更新)。