Dieses Muster trennt behebbare Domänenfehler von wirklich unerwarteten, indem HTTP-Fehler vor dem Erreichen von Angulars globalem ErrorHandler in eine diskriminierte Fehler-Unterklasse gepackt werden. Statt eines generischen Catch-all, das rohe HttpErrorResponse-Objekte protokolliert, übersetzt catchError Transportfehler in typisierte HttpDomainError-Instanzen mit einer engen Union bekannter Codes. Der globale Handler verzweigt dann per instanceof: Domänenfehler erhalten strukturiertes, verwertbares Logging, alles andere fällt in einen Catch-all-Pfad — eine stille Fehlklassifizierung wird so zur Compile-Zeit unmöglich.
import { ErrorHandler, Injectable, inject } from '@angular/core';import { catchError, throwError, Observable } from 'rxjs';class HttpDomainError extends Error {constructor(public readonly code: 'NOT_FOUND' | 'CONFLICT' | 'SERVER', message: string) {super(message);this.name = 'HttpDomainError';}}@Injectable()class GlobalErrorHandler implements ErrorHandler {handleError(error: unknown): void {if (error instanceof HttpDomainError) {console.error(`[domain:${error.code}]`, error.message);return;}console.error('[unhandled]', error);}}function loadOrder$(id: string, http: { get: (u: string) => Observable<unknown> }) {return http.get(`/orders/${id}`).pipe(catchError((err: { status?: number }) => {const code = err.status === 404 ? 'NOT_FOUND' : err.status === 409 ? 'CONFLICT' : 'SERVER';return throwError(() => new HttpDomainError(code, `Order ${id} failed`));}));}