En aquest tema, aprendrem com gestionar errors en aplicacions Angular, especialment quan fem sol·licituds HTTP. La gestió d'errors és una part crucial del desenvolupament d'aplicacions robustes i fiables. Ens assegura que l'aplicació pugui manejar situacions inesperades de manera elegant i proporcionar una bona experiència d'usuari.
Conceptes clau
-
Tipus d'errors HTTP:
- Errors del client (4xx): Aquests errors indiquen que hi ha un problema amb la sol·licitud enviada pel client. Exemples comuns inclouen 404 (No trobat) i 400 (Sol·licitud incorrecta).
- Errors del servidor (5xx): Aquests errors indiquen que hi ha un problema amb el servidor que processa la sol·licitud. Un exemple comú és el 500 (Error intern del servidor).
-
Gestió d'errors amb el client HTTP d'Angular:
- Utilitzar el mètode
catchError
de RxJS per interceptar i gestionar errors en les sol·licituds HTTP.
- Utilitzar el mètode
-
Proporcionar retroalimentació a l'usuari:
- Mostrar missatges d'error clars i útils a l'usuari quan es produeix un error.
Exemple pràctic
- Configuració del servei HTTP
Primer, crearem un servei que faci una sol·licitud HTTP i gestioni els errors.
import { Injectable } from '@angular/core'; import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class DataService { private apiUrl = 'https://api.example.com/data'; constructor(private http: HttpClient) { } getData(): Observable<any> { return this.http.get<any>(this.apiUrl).pipe( catchError(this.handleError) ); } private handleError(error: HttpErrorResponse) { let errorMessage = ''; if (error.error instanceof ErrorEvent) { // Error del client errorMessage = `Error: ${error.error.message}`; } else { // Error del servidor errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`; } return throwError(errorMessage); } }
- Utilització del servei en un component
Ara, utilitzarem el servei en un component i mostrarem els errors a l'usuari.
import { Component, OnInit } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-data', template: ` <div *ngIf="errorMessage" class="error"> {{ errorMessage }} </div> <div *ngIf="data"> <!-- Mostrar les dades aquí --> </div> `, styles: [` .error { color: red; } `] }) export class DataComponent implements OnInit { data: any; errorMessage: string; constructor(private dataService: DataService) { } ngOnInit(): void { this.dataService.getData().subscribe( (response) => { this.data = response; }, (error) => { this.errorMessage = error; } ); } }
- Explicació del codi
-
Servei
DataService
:- El mètode
getData
fa una sol·licitud GET a l'API. - Utilitza
catchError
per interceptar errors i passar-los al mètodehandleError
. - El mètode
handleError
distingeix entre errors del client i del servidor i retorna un missatge d'error adequat.
- El mètode
-
Component
DataComponent
:- Utilitza el servei
DataService
per obtenir dades. - Si es produeix un error, el missatge d'error es guarda a
errorMessage
i es mostra a l'usuari.
- Utilitza el servei
Exercici pràctic
Exercici
- Crea un nou servei que faci una sol·licitud POST a una API fictícia.
- Implementa la gestió d'errors per a la sol·licitud POST.
- Utilitza el servei en un component i mostra els errors a l'usuari.
Solució
Servei
import { Injectable } from '@angular/core'; import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class PostService { private apiUrl = 'https://api.example.com/post'; constructor(private http: HttpClient) { } createPost(data: any): Observable<any> { return this.http.post<any>(this.apiUrl, data).pipe( catchError(this.handleError) ); } private handleError(error: HttpErrorResponse) { let errorMessage = ''; if (error.error instanceof ErrorEvent) { // Error del client errorMessage = `Error: ${error.error.message}`; } else { // Error del servidor errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`; } return throwError(errorMessage); } }
Component
import { Component } from '@angular/core'; import { PostService } from './post.service'; @Component({ selector: 'app-post', template: ` <div *ngIf="errorMessage" class="error"> {{ errorMessage }} </div> <button (click)="createPost()">Create Post</button> `, styles: [` .error { color: red; } `] }) export class PostComponent { errorMessage: string; constructor(private postService: PostService) { } createPost(): void { const postData = { title: 'New Post', content: 'This is a new post.' }; this.postService.createPost(postData).subscribe( (response) => { console.log('Post created successfully', response); }, (error) => { this.errorMessage = error; } ); } }
Conclusió
En aquesta secció, hem après com gestionar errors en aplicacions Angular, especialment en sol·licituds HTTP. Hem vist com utilitzar el mètode catchError
de RxJS per interceptar errors i proporcionar missatges d'error útils a l'usuari. La gestió d'errors és essencial per crear aplicacions robustes i proporcionar una bona experiència d'usuari.
Curs d'Angular
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- Arquitectura d'Angular
- Primera aplicació Angular
Mòdul 2: Components d'Angular
- Comprendre els components
- Crear components
- Plantilles de components
- Estils de components
- Interacció de components
Mòdul 3: Enllaç de dades i directives
- Interpolació i enllaç de propietats
- Enllaç d'esdeveniments
- Enllaç de dades bidireccional
- Directives integrades
- Directives personalitzades
Mòdul 4: Serveis i injecció de dependències
Mòdul 5: Enrutament i navegació
Mòdul 6: Formularis a Angular
Mòdul 7: Client HTTP i observables
- Introducció al client HTTP
- Fer sol·licituds HTTP
- Gestionar respostes HTTP
- Utilitzar observables
- Gestió d'errors
Mòdul 8: Gestió d'estat
- Introducció a la gestió d'estat
- Utilitzar serveis per a la gestió d'estat
- NgRx Store
- NgRx Effects
- NgRx Entity
Mòdul 9: Proves a Angular
- Proves unitàries
- Proves de components
- Proves de serveis
- Proves de cap a cap
- Simulació de dependències
Mòdul 10: Conceptes avançats d'Angular
- Angular Universal
- Optimització del rendiment
- Internacionalització (i18n)
- Tubs personalitzats
- Animacions d'Angular