0 Tage Serie
javascript / expert
Snippet

Wiederherstellbare Fehlergrenzen mit RxJS catchError-Ketten

Zeigt eine mehrschichtige Fehlerbehandlungsstrategie für einen Angular-Service: begrenzte Wiederholungsversuche bei vorübergehenden Netzwerkproblemen, eine Timeout-Absicherung gegen hängende Anfragen und eine benutzerdefinierte Fehlerklasse, die wiederherstellbare Serverfehler (stillschweigend durch Standardwerte ersetzt) von nicht wiederherstellbaren (erneut ausgelöst zur Behandlung durch den Aufrufer) unterscheidet. So wird das verbreitete Anti-Pattern vermieden, entweder jeden Fehler zu verschlucken oder die Komponente bei jedem Fehler abstürzen zu lassen.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError, of } from 'rxjs';
import { catchError, retry, timeout } from 'rxjs/operators';
class RecoverableApiError extends Error {
constructor(message: string, public readonly statusCode: number, public readonly fallbackUsed: boolean) {
super(message);
this.name = 'RecoverableApiError';
}
}
@Injectable({ providedIn: 'root' })
export class ResilientConfigService {
constructor(private http: HttpClient) {}
loadConfig(): Observable<Record<string, unknown>> {
return this.http.get<Record<string, unknown>>('/api/config').pipe(
timeout(3000),
retry({ count: 2, delay: 500 }),
catchError((err: HttpErrorResponse) => {
if (err.status >= 500) {
console.error(new RecoverableApiError('Server unavailable, using defaults', err.status, true));
return of({ theme: 'default', locale: 'en' });
}
return throwError(() => new RecoverableApiError('Config fetch failed', err.status, false));
}),
);
}
}
angular
Erklärung
1
class RecoverableApiError extends Error
Eine benutzerdefinierte Fehler-Unterklasse mit strukturierten Metadaten (statusCode, fallbackUsed), sodass nachgelagerte Handler anhand der Fehlersemantik verzweigen können, statt Message-Strings zu parsen.
2
retry({ count: 2, delay: 500 })
Begrenzt Wiederholungsversuche auf zwei mit fester Verzögerung und verhindert so einen unbegrenzten Retry-Sturm gegen ein überlastetes Backend.
3
return of({ theme: 'default', locale: 'en' });
Degradiert bei 5xx-Fehlern stillschweigend zu sicheren Standardwerten, statt die gesamte App-Shell scheitern zu lassen.