2
votes

Les erreurs ne sont pas capturées avec la gestion des erreurs try catch

Je construis une application de démonstration angulaire 7 où j'ai une méthode POST générique. Bien que je puisse appeler cette méthode, il semble qu'aucune des erreurs (401 500, etc.) ne soit capturée dans le bloc catch. Je peux voir dans l'onglet réseau que la publication a échoué. Quel est le problème avec le code ci-dessous?

// Méthode de publication générique

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


0 commentaires

3 Réponses :


1
votes

Rxjs 6 a un opérateur catch qui peut être trouvé sur son site ici a >. Je pense que vous pouvez essayer ce qui suit en utilisant ce qu'ils fournissent. Peu différent de la promesse que vous utilisez, mais devrait fournir la détection d'erreur que vous recherchez.

(Best pourrait arriver après modification)

Solution de travail

Utilisez catchError pour obtenir l'erreur Http et puis utilisez l'opérateur of pour vous assurer qu'il renvoie un observable. Essayé et testé dans un petit programme fonctionnant pour le moment et tout fonctionne juste incertain de l'utilisation de promise.

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

solution préférée

Ce que je préférerais faire est de chercher à détecter les erreurs dans une fonction d'abonnement au sein du composant. Donc, dans votre composant où vous appelez la fonction, essayez.

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

Où votre appel principal dans le service utilisant le HTTP et les observables ressemblerait à ce qui suit.

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


2 commentaires

Dince, notez que vous utilisez Rxjs 5, pas Rxjs 6


Je devrais le mentionner plus tôt mais je préférerais utiliser la fonctionnalité async / await plutôt que de m'abonner.



0
votes

essayez d'utiliser des tuyaux pour détecter les erreurs.
par exemple

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


0 commentaires

0
votes

Il semble que le code d'origine fonctionne réellement. Toutes les erreurs sont capturées dans le bloc catch. La solution était assez simple, mettre à jour les modules vers les dernières versions (mise à jour nmp).


0 commentaires