Fehlertaxonomie für Geschäfts-Apps: konsistente UI und Überwachung
Eine Fehlertaxonomie für Geschäfts-Apps hilft, Validierungs-, Auth-, Rate-Limit- und Abhängigkeitsfehler zu klassifizieren, damit Alarme und UI-Reaktionen konsistent bleiben.

Welches Problem eine Fehlertaxonomie in echten Business-Apps löst
Eine Fehlertaxonomie ist eine gemeinsame Art, Fehler zu benennen und zu gruppieren, damit alle sie gleich behandeln. Statt dass jeder Screen und jede API eigene Meldungen erfindet, definiert man eine kleine Menge von Kategorien (z. B. Validierung oder Auth) und Regeln dafür, wie sie den Nutzern und dem Monitoring angezeigt werden.
Ohne diese gemeinsame Struktur tritt dasselbe Problem in verschiedenen Formen auf. Ein fehlendes Pflichtfeld kann mobil als „Bad Request“, im Web als „Etwas ist schiefgelaufen“ und in Logs als Stacktrace erscheinen. Nutzer wissen nicht, was sie als Nächstes tun sollen, und On-Call-Teams verschwenden Zeit mit Rätselraten, ob es ein Nutzerfehler, ein Angriff oder ein Ausfall ist.
Das Ziel ist Konsistenz: derselbe Fehler führt zu demselben UI-Verhalten und zu derselben Alarmierung. Validierungsprobleme sollten auf das genaue Feld zeigen. Berechtigungsprobleme sollten die Aktion stoppen und erklären, welcher Zugriff fehlt. Abhängigkeitsfehler sollten einen sicheren Retry anbieten, während das Monitoring den richtigen Alarm auslöst.
Ein realistisches Beispiel: Ein Vertriebsmitarbeiter versucht, einen Kundendatensatz anzulegen, aber der Zahlungsdienst ist ausgefallen. Wenn Ihre App einfach ein generisches 500 zurückgibt, wird er erneut senden und später Duplikate erzeugen. Mit einer klaren Kategorie für Abhängigkeitsfehler kann die UI sagen, dass der Dienst vorübergehend nicht verfügbar ist, doppelte Einreichungen verhindern und das Monitoring das richtige Team alarmieren.
Diese Abstimmung ist besonders wichtig, wenn ein Backend mehrere Clients bedient. Wenn API, Web-App, Mobile-App und interne Tools alle dieselben Kategorien und Codes nutzen, fühlen sich Fehler nicht mehr zufällig an.
Ein einfaches Modell: Kategorie, Code, Meldung, Details
Taxonomien bleiben pflegeleicht, wenn Sie vier Dinge trennen, die oft vermischt werden: die Kategorie (welche Art von Problem es ist), den Code (ein stabiler Identifier), die Meldung (Text für Menschen) und die Details (strukturierter Kontext). HTTP-Status ist weiterhin wichtig, sollte aber nicht die ganze Geschichte sein.
Kategorie beantwortet: „Wie sollen UI und Monitoring reagieren?“ Ein 403 kann an einer Stelle „auth“ bedeuten, während ein anderer 403 später „policy“ sein könnte, wenn Sie Regeln hinzufügen. Kategorie betrifft Verhalten, nicht Transport.
Code beantwortet: „Was ist genau passiert?“ Codes sollten stabil und unspektakulär sein. Wenn Sie einen Button umbenennen oder einen Service refactoren, sollte der Code unverändert bleiben. Dashboards, Alerts und Support-Skripte hängen davon ab.
Meldung beantwortet: „Was sagen wir einer Person?“ Entscheiden Sie, für wen die Meldung gedacht ist. Eine benutzerseitige Meldung sollte kurz und freundlich sein. Eine Support-Meldung kann nächste Schritte enthalten. Logs dürfen technischer sein.
Details beantworten: „Was brauchen wir, um es zu beheben?“ Halten Sie Details strukturiert, damit die UI reagieren kann. Bei einem Formularfehler sind das Feldnamen. Bei einem Abhängigkeitsproblem der Name des Upstream-Services und ein retry-after-Wert.
Hier ist eine kompakte Form, die viele Teams nutzen:
{
"category": "validation",
"code": "CUSTOMER_EMAIL_INVALID",
"message": "Enter a valid email address.",
"details": { "field": "email", "rule": "email" }
}
Wenn Funktionen sich ändern, halten Sie Kategorien klein und stabil und fügen Sie neue Codes hinzu, statt alte wiederzuverwenden. Das sorgt dafür, dass UI-Verhalten, Monitoring-Trends und Support-Playbooks verlässlich bleiben, während das Produkt wächst.
Kernkategorien: validation, auth, rate limits, dependencies
Die meisten Business-Apps können mit vier Kategorien starten, die überall auftreten. Wenn Sie sie im Backend, Web und Mobile gleich benennen und behandeln, kann Ihre UI konsistent reagieren und Ihr Monitoring wird lesbar.
Validation (erwartet)
Validierungsfehler treten auf, wenn Benutzereingaben oder eine Geschäftsregel fehlschlagen. Das ist normal und sollte leicht zu beheben sein: fehlende Pflichtfelder, ungültige Formate oder Regeln wie „Rabatt darf 20% nicht überschreiten“ oder „Bestellsumme muss > $0 sein“. Die UI sollte das genaue Feld oder die Regel hervorheben, nicht eine generische Warnung anzeigen.
Authentifizierung vs. Autorisierung (erwartet)
Auth-Fehler teilen sich meist in zwei Fälle: nicht authentifiziert (nicht eingeloggt, Session abgelaufen, Token fehlt) und nicht autorisiert (eingeloggt, aber ohne Berechtigung). Behandeln Sie sie unterschiedlich. „Bitte melden Sie sich erneut an“ passt zum ersten. Beim zweiten sollten Sie keine sensiblen Details verraten, aber klar sein: „Sie haben keinen Zugriff, um Rechnungen zu genehmigen.“
Rate Limits (erwartet, aber zeitbasiert)
Rate-Limiting bedeutet „zu viele Anfragen, bitte später versuchen“. Es taucht oft bei Imports, stark genutzten Dashboards oder wiederholten Retries auf. Geben Sie einen retry-after-Hinweis (auch „warte 30 Sekunden“ ist hilfreich) und lassen Sie die UI zurückhalten, statt den Server zu überlasten.
Abhängigkeitsfehler (oft unerwartet)
Abhängigkeitsfehler kommen von Upstream-Services, Timeouts oder Ausfällen: Zahlungsanbieter, E-Mail/SMS, Datenbanken oder interne Dienste. Nutzer können diese Fehler nicht selbst beheben; die UI sollte einen sicheren Fallback anbieten (Entwurf speichern, später versuchen, Support kontaktieren).
Der entscheidende Unterschied ist das Verhalten: erwartete Fehler sind Teil des normalen Ablaufs und verdienen präzises Feedback; unerwartete Fehler signalisieren Instabilität und sollten Alerts, Correlation-IDs und sorgfältiges Logging auslösen.
Schritt für Schritt: Ihre Taxonomie in einem Workshop erstellen
Eine Taxonomie sollte klein genug sein, um sich zu merken, aber streng genug, dass zwei Teams dasselbe Problem gleich benennen.
1) Timeboxen und eine kleine Menge auswählen
Starten Sie mit einem 60–90-minütigen Workshop. Listen Sie die Fehler auf, die Sie am häufigsten sehen (falsche Eingaben, Login-Probleme, zu viele Anfragen, Drittanbieter-Ausfälle, unerwartete Bugs) und fassen Sie sie zu 6–12 Kategorien zusammen, die jeder ohne Nachschlagen aussprechen kann.
2) Ein stabiles Code-Schema vereinbaren
Wählen Sie ein Namensmuster, das in Logs und Tickets lesbar bleibt. Halten Sie es kurz, vermeiden Sie Versionsnummern und betrachten Sie Codes als permanent, sobald sie veröffentlicht sind. Ein gängiges Muster ist ein Kategorie-Präfix plus ein klarer Slug, z. B. AUTH_INVALID_TOKEN oder DEP_PAYMENT_TIMEOUT.
Bevor Sie den Raum verlassen, entscheiden Sie, was jede Fehlerantwort mindestens enthalten muss: Kategorie, Code, sichere Meldung, strukturierte Details und eine Trace- oder Request-ID.
3) Eine Regel für Kategorie vs. Code schreiben
Teams stolpern, wenn Kategorien zur Ablage werden. Eine einfache Regel hilft: Kategorie beantwortet „Wie sollen UI und Monitoring reagieren?“, Code beantwortet „Was genau ist passiert?“. Wenn zwei Fehler unterschiedliches UI-Verhalten benötigen, sollten sie nicht dieselbe Kategorie teilen.
4) Standard-UI-Verhalten pro Kategorie festlegen
Entscheiden Sie, was Nutzer standardmäßig sehen. Validierung hebt Felder hervor. Auth leitet zur Anmeldung oder zeigt eine Zugriffs-Meldung. Rate Limits zeigen „Versuchen Sie es in X Sekunden erneut“. Abhängigkeitsfehler zeigen einen ruhigen Retry-Bildschirm. Wenn diese Defaults existieren, können neue Features ihnen folgen statt Einzellösungen zu erfinden.
5) Mit realen Szenarien testen
Führen Sie fünf häufige Flows durch (Registrierung, Checkout, Suche, Admin-Änderung, Datei-Upload) und labeln Sie jeden Fehler. Wenn die Gruppe diskutiert, brauchen Sie meist eine klarere Regel, nicht zwanzig neue Codes.
Validierungsfehler: machbar für Nutzer
Validation ist der Fehlertyp, den Sie in der Regel sofort anzeigen möchten. Er sollte vorhersehbar sein: er sagt dem Nutzer, was zu beheben ist, und sollte niemals eine Retry-Schleife auslösen.
Feldspezifische und formularweite Validierung sind unterschiedliche Probleme. Feldfehler beziehen sich auf ein Eingabefeld (E-Mail, Telefon, Betrag). Formularfehler betreffen die Kombination von Eingaben (Startdatum muss vor Enddatum liegen) oder fehlende Voraussetzungen (keine Versandart ausgewählt). Ihre API-Antwort sollte diesen Unterschied deutlich machen, damit die UI korrekt reagiert.
Ein häufiger Geschäftsregel-Fehler ist „Kreditlimit überschritten“. Der Nutzer hat vielleicht eine gültige Zahl eingegeben, aber die Aktion ist basierend auf Kontostatus nicht erlaubt. Behandeln Sie das als formularweiten Validierungsfehler mit klarem Grund und einem sicheren Hinweis wie „Ihr verfügbares Limit ist $500. Verringern Sie den Betrag oder beantragen Sie eine Erhöhung.“ Vermeiden Sie interne Namen wie Datenbankfelder, Scoring-Modelle oder Regel-Engine-Details offenzulegen.
Eine handlungsfähige Antwort enthält üblicherweise einen stabilen Code (nicht nur einen englischen Satz), eine benutzerfreundliche Meldung, optionale Feldzeiger für Feldfehler und kleine sichere Hinweise (Formatbeispiele, erlaubte Bereiche). Wenn Ingenieure eine Regelbezeichnung brauchen, legen Sie sie in Logs ab, nicht in der UI.
Loggen Sie Validierungsfehler anders als Systemfehler. Sie brauchen genug Kontext, um Muster zu debuggen, ohne sensible Daten zu speichern. Erfassen Sie Nutzer-ID, Request-ID, den Regel-Namen oder Code und welche Felder fehlgeschlagen sind. Für Werte loggen Sie nur, was nötig ist (oft „vorhanden/fehlend“ oder Länge) und maskieren Sie sensible Daten.
In der UI: Fokus auf Beheben, nicht auf erneutes Senden. Heben Sie Felder hervor, behalten Sie die Eingaben des Nutzers, scrollen Sie zur ersten Fehlermeldung und deaktivieren Sie automatische Retries. Validierungsfehler sind nicht temporär, daher ist „nochmals versuchen“ Zeitverschwendung.
Auth- und Berechtigungsfehler: Sicherheit und Klarheit bewahren
Authentifizierungs- und Autorisierungsfehler sehen für Nutzer ähnlich aus, bedeuten aber unterschiedliche Dinge für Sicherheit, UI-Flow und Monitoring. Sie zu trennen macht das Verhalten auf Web, Mobile und API-Clients konsistent.
Unauthenticated bedeutet, dass die App die Identität des Nutzers nicht verifizieren kann. Typische Ursachen sind fehlende Credentials, ein ungültiges Token oder eine abgelaufene Session. Forbidden bedeutet, dass der Nutzer bekannt ist, aber nicht berechtigt ist, die Aktion auszuführen.
Session abgelaufen ist der häufigste Sonderfall. Wenn Sie Refresh-Tokens unterstützen, versuchen Sie einmal ein stilles Refresh und wiederholen dann die ursprüngliche Anfrage. Wenn das Refresh fehlschlägt, geben Sie einen unauthenticated-Fehler zurück und leiten den Nutzer zur Anmeldung. Vermeiden Sie Schleifen: Nach einem Refresh-Versuch stoppen Sie und zeigen einen klaren nächsten Schritt an.
Das UI-Verhalten sollte vorhersehbar bleiben:
- Unauthenticated: zur Anmeldung auffordern und die Aufgabe erhalten
- Forbidden: auf der Seite bleiben und eine Zugriffs-Meldung zeigen, plus eine sichere Aktion wie „Zugriff anfordern"
- Konto deaktiviert oder entzogen: ausloggen und eine kurze Meldung anzeigen, dass Support helfen kann
Für Auditing loggen Sie genug, um „wer hat was versucht und warum wurde es blockiert“ beantworten zu können, ohne Geheimnisse offenzulegen. Eine nützliche Aufzeichnung enthält Nutzer-ID (falls bekannt), Tenant oder Workspace, Aktionsname, Ressourcen-Identifier, Timestamp, Request-ID und das Policy-Check-Ergebnis (erlaubt/abgelehnt). Halten Sie rohe Tokens und Passwörter aus den Logs heraus.
In benutzerseitigen Meldungen verraten Sie keine Rollennamen, Berechtigungsregeln oder interne Policy-Struktur. „Sie haben keinen Zugriff, um Rechnungen zu genehmigen“ ist sicherer als „Nur FinanceAdmin kann Rechnungen genehmigen.“
Rate-Limit-Fehler: vorhersagbares Verhalten unter Last
Rate-Limits sind keine Bugs. Sie sind ein Sicherheitsnetz. Behandeln Sie sie als erstklassige Kategorie, damit UI, Logs und Alerts konsistent reagieren, wenn die Last steigt.
Rate-Limits treten meist in einigen Formen auf: pro Nutzer (eine Person klickt zu schnell), pro IP (viele Nutzer hinter einem Büro-Netzwerk) oder pro API-Key (eine einzelne Integration läuft außer Kontrolle). Die Ursache ist wichtig, denn die Lösung unterscheidet sich.
Was eine gute Rate-Limit-Antwort enthält
Clients brauchen zwei Dinge: dass sie limitiert sind, und wann sie es erneut versuchen können. Geben Sie HTTP 429 plus eine klare Wartezeit zurück (z. B. Retry-After: 30). Enthalten Sie auch einen stabilen Fehlercode (z. B. RATE_LIMITED), damit Dashboards Ereignisse gruppieren können.
Halten Sie die Meldung ruhig und konkret. „Zu viele Anfragen“ ist zwar technisch korrekt, aber nicht hilfreich. „Bitte warten Sie 30 Sekunden und versuchen Sie es erneut“ setzt Erwartungen und reduziert wiederholte Klicks.
Auf der UI-Seite verhindern Sie schnelle Retries. Ein einfaches Muster ist, die Aktion für die Wartezeit zu deaktivieren, einen kurzen Countdown anzuzeigen und nach Ablauf einen sicheren Retry anzubieten. Vermeiden Sie Formulierungen, die Nutzer glauben lassen, Daten gingen verloren.
Im Monitoring überreagieren Teams oft. Pager nicht wegen jedes 429. Tracken Sie Raten und alarmieren Sie bei ungewöhnlichen Spitzen: ein plötzlicher Anstieg für einen Endpunkt, Tenant oder API-Key ist handlungsrelevant.
Das Backend-Verhalten sollte ebenfalls vorhersagbar sein. Verwenden Sie exponentielles Backoff für automatische Retries und gestalten Sie Retries idempotent. Eine „Rechnung erstellen“-Aktion sollte nicht zwei Rechnungen erzeugen, wenn die erste Anfrage tatsächlich erfolgreich war.
Abhängigkeitsfehler: Ausfälle ohne Chaos behandeln
Abhängigkeitsfehler sind solche, die Nutzer nicht durch bessere Eingaben lösen können. Der Nutzer hat alles richtig gemacht, aber ein Zahlungs-Gateway hat ein Timeout, die Datenbank ist weg oder ein Upstream-Service liefert 5xx. Behandeln Sie diese als eigene Kategorie, damit UI und Monitoring vorhersagbar reagieren.
Nennen Sie die üblichen Fehlertypen: Timeout, Verbindungsfehler (DNS, TLS, refused) und Upstream-5xx (Bad Gateway, Service Unavailable). Auch wenn die Ursache unklar bleibt, können Sie erfassen, was passiert ist, und konsistent reagieren.
Retry vs. schnelles Scheitern
Retries helfen bei kurzen Aussetzern, können aber einen Ausfall verschlimmern. Verwenden Sie einfache Regeln, damit jedes Team dieselbe Entscheidung trifft.
- Retry, wenn der Fehler wahrscheinlich vorübergehend ist: Timeouts, Connection Resets, 502/503
- Schnell scheitern bei user-verursachten oder permanenten Fällen: 4xx vom Dependency, ungültige Credentials, fehlende Ressource
- Retries begrenzen (z. B. 2–3 Versuche) und kleines Backoff hinzufügen
- Nie nicht-idempotente Aktionen ohne Idempotency-Key erneut versuchen
UI-Verhalten und sichere Fallbacks
Bei einem Abhängigkeitsfehler sagen Sie dem Nutzer, was er als Nächstes tun kann, ohne ihn zu beschuldigen: „Vorübergehendes Problem. Bitte versuchen Sie es später erneut.“ Wenn es einen sicheren Fallback gibt, bieten Sie ihn an. Beispiel: Wenn Stripe ausfällt, lassen Sie den Nutzer die Bestellung als „Ausstehende Zahlung“ speichern und statten Sie stattdessen eine Bestätigungs-E-Mail aus, statt den Warenkorb zu verlieren.
Schützen Sie Nutzer auch vor doppelten Einsendungen. Wenn der Nutzer während einer langsamen Antwort zweimal auf „Bezahlen“ tippt, sollte Ihr System dies erkennen. Verwenden Sie Idempotency-Keys für Create-and-Charge-Flows oder Statusprüfungen wie „Bestellung bereits bezahlt“, bevor Sie die Aktion erneut ausführen.
Für Monitoring loggen Sie Felder, die eine schnelle Frage beantworten: „Welches Dependency versagt und wie schlimm ist es?“ Erfassen Sie Dependency-Name, Endpoint oder Operation, Dauer und das finale Ergebnis (Timeout, Connect, Upstream 5xx). So werden Alerts und Dashboards sinnvoll statt laut.
Monitoring und UI über Kanäle hinweg konsistent machen
Taxonomien wirken nur, wenn jeder Kanal dieselbe Sprache spricht: API, Web-UI, Mobile-App und Ihre Logs. Sonst erscheint dasselbe Problem als fünf verschiedene Meldungen und niemand weiß, ob es ein Nutzerfehler oder ein echter Ausfall ist.
Behandeln Sie HTTP-Statuscodes als sekundäre Ebene. Sie helfen bei Proxies und grundlegendem Client-Verhalten, aber Ihre Kategorie und Ihr Code sollten die Bedeutung tragen. Ein Dependency-Timeout kann weiterhin ein 503 sein, aber die Kategorie sagt der UI „Erneut versuchen“ und dem Monitoring „Page on-call“.
Lassen Sie jede API ein standardisiertes Fehlerformat zurückgeben, auch wenn die Quelle unterschiedlich ist (Datenbank, Auth-Modul, Drittanbieter-API). Eine einfache Form hält UI-Handling und Dashboards konsistent:
{
"category": "dependency",
"code": "PAYMENTS_TIMEOUT",
"message": "Payment service is not responding.",
"details": {"provider": "stripe"},
"correlation_id": "9f2c2c3a-6a2b-4a0a-9e9d-0b0c0c8b2b10"
}
Correlation-IDs sind die Brücke zwischen „ein Nutzer sah einen Fehler“ und „wir können ihn nachverfolgen“. Zeigen Sie die correlation_id in der UI (ein Kopier-Button hilft) und loggen Sie sie immer im Backend, damit Sie eine Anfrage über Services hinweg verfolgen können.
Vereinbaren Sie, was sicher in der UI gezeigt wird und was nur in Logs bleibt. Ein praktischer Split ist: UI bekommt Kategorie, eine klare Meldung und einen nächsten Schritt; Logs bekommen technische Fehlerdetails und Request-Kontext; beide teilen correlation_id und den stabilen Fehlercode.
Schnelle Checkliste für ein konsistentes Fehlersystem
Konsistenz ist in der besten Bedeutung langweilig: jeder Kanal verhält sich gleich und das Monitoring sagt die Wahrheit.
Prüfen Sie zuerst das Backend, inklusive Hintergrundjobs und Webhooks. Wenn ein Feld optional ist, lassen es Leute aus und die Konsistenz bricht.
- Jeder Fehler enthält Kategorie, stabilen Code, benutzersichere Meldung und Trace-ID.
- Validierungsprobleme sind erwartet und sollten keine Paging-Alerts auslösen.
- Auth- und Berechtigungsprobleme werden für Sicherheitsmuster getrackt, aber nicht wie Ausfälle behandelt.
- Rate-Limit-Antworten enthalten einen Retry-Hinweis (z. B. Sekunden zu warten) und fluten keine Alerts.
- Abhängigkeitsfehler enthalten den Dependency-Namen sowie Timeout- oder Statusdetails.
Dann prüfen Sie die UI-Regeln. Jede Kategorie sollte auf genau ein vorhersehbares Screen-Verhalten abgebildet werden, damit Nutzer nicht raten müssen, was als Nächstes zu tun ist: Validation hebt Felder hervor, Auth fordert zur Anmeldung oder zeigt Zugriff, Rate Limits zeigen eine ruhige Warteanzeige, Abhängigkeitsfehler bieten Retry und Fallbacks, wenn möglich.
Ein einfacher Test ist, in Staging je einen Fehler pro Kategorie auszulösen und zu prüfen, ob Web-App, Mobile-App und Admin-Panel dasselbe Ergebnis zeigen.
Häufige Fehler und praktische nächste Schritte
Der schnellste Weg, ein Fehlersystem zu zerstören, ist, es als Nebensache zu behandeln. Verschiedene Teams nutzen dann unterschiedliche Wörter, Codes und UI-Verhalten für dasselbe Problem. Taxonomiearbeit zahlt sich aus, wenn sie konsistent bleibt.
Häufige Fehlerbilder:
- Interne Exception-Texte an Nutzer leaken. Das verwirrt und kann sensible Details offenbaren.
- Alle 4xx als „validation“ zu kennzeichnen. Fehlende Berechtigung ist nicht dasselbe wie ein fehlendes Feld.
- Für jede Funktion neue Codes erfinden, ohne Review. Am Ende haben Sie 200 Codes, die dieselben 5 Dinge bedeuten.
- Die falschen Fehler erneut versuchen. Einen Berechtigungsfehler oder eine falsche E-Mail-Adresse zu retryen erzeugt nur Lärm.
Ein einfaches Beispiel: Ein Vertriebsmitarbeiter sendet ein „Kunde erstellen“-Formular und erhält ein 403. Wenn die UI alle 4xx als Validierung behandelt, hebt sie zufällige Felder hervor und fordert zum „Eingaben korrigieren“ auf, statt zu sagen, dass Zugriff nötig ist. Das Monitoring zeigt dann eine Spitze bei „Validations“, obwohl das echte Problem Rollen sind.
Praktische nächste Schritte, die in einen kurzen Workshop passen: Schreiben Sie eine einseitige Taxonomie-Dokumentation (Kategorien, Wann sie zu verwenden sind, 5–10 kanonische Codes), definieren Sie Nachrichtenregeln (was Nutzer sehen vs. was in Logs kommt), fügen Sie ein leichtes Review-Gate für neue Codes hinzu, legen Sie Retry-Regeln nach Kategorie fest und implementieren Sie Ende-zu-Ende (Backend-Antwort, UI-Mapping und Monitoring-Dashboards).
Wenn Sie mit AppMaster (appmaster.io) bauen, hilft es, diese Regeln zentral zu halten, damit dieselbe Kategorie- und Code-Logik im Backend, in der Web-App und in nativen Mobile-Apps angewendet wird.
FAQ
Beginnen Sie, wenn dasselbe Backend mehr als einen Client bedient (Web, Mobile, interne Tools) oder wenn Support und On-Call-Teams ständig fragen: „Ist das ein Benutzerfehler oder ein Systemproblem?“ Eine Taxonomie zahlt sich schnell aus, sobald Sie wiederkehrende Abläufe wie Registrierung, Checkout, Importe oder Admin-Änderungen haben, bei denen ein konsistentes Handling wichtig ist.
Ein guter Ausgangspunkt sind 6–12 Kategorien, die sich Leute merken können, ohne ständig in die Dokumentation zu schauen. Halten Sie Kategorien stabil und breit (z. B. validation, auth, rate_limit, dependency, conflict, internal) und drücken Sie die spezifische Situation mit einem Code aus, nicht durch neue Kategorien.
Die Kategorie steuert das Verhalten, der Code identifiziert die genaue Situation. Die Kategorie sagt UI und Monitoring, was zu tun ist (Felder hervorheben, zur Anmeldung auffordern, zurückhalten, Retry anbieten), während der Code stabil für Dashboards, Alerts und Support-Skripte bleibt, selbst wenn sich der UI-Text ändert.
Behandeln Sie Meldungen als Inhalte, nicht als Identifikatoren. Geben Sie eine kurze, benutzersichere Meldung für die UI zurück und verwenden Sie den stabilen Code für Gruppierung und Automatisierung. Technischere Formulierungen gehören in die Logs und sind mit derselben Correlation-ID verknüpft.
Jede API-Antwort sollte Kategorie, einen stabilen Code, eine benutzersichere Meldung, strukturierte Details und eine Korrelations- oder Request-ID beinhalten. Details sollten so gestaltet sein, dass der Client damit arbeiten kann (welches Feld betroffen ist, wie lange zu warten ist), ohne rohe Exception-Texte zu liefern.
Geben Sie wenn möglich Field-Level-Pointer zurück, sodass die UI genau das Eingabefeld hervorheben und die vom Benutzer eingegebenen Werte behalten kann. Verwenden Sie separate Form-Level-Fehler, wenn das Problem mehrere Felder betrifft oder eine Geschäftsregel (z. B. Datumsbereich oder Kreditlimit), damit die UI nicht falsche Felder vermutet.
Unauthenticated bedeutet, dass der Nutzer nicht angemeldet ist oder das Session-/Token ungültig ist — die UI sollte zur Anmeldung leiten und die Aufgabe erhalten. Forbidden bedeutet, dass der Nutzer angemeldet, aber nicht berechtigt ist — die UI sollte auf der Seite bleiben und eine Zugriffs-Meldung anzeigen, ohne Rollen- oder Policy-Details preiszugeben.
Geben Sie eine explizite Wartezeit zurück (z. B. einen Retry-After-Wert) und halten Sie den Code stabil, damit Clients konsequent Backoff implementieren können. In der UI sollten wiederholte Klicks deaktiviert und klare nächste Schritte angezeigt werden, denn automatische schnelle Retries verschlimmern Rate-Limits meist.
Retrys nur, wenn der Fehler wahrscheinlich vorübergehend ist (Timeouts, Verbindungsresets, upstream 502/503) und begrenzen Sie die Versuche mit kleinem Backoff. Für nicht-idempotente Aktionen verlangen Sie einen Idempotency-Key oder führen Statusprüfungen durch; sonst kann ein Retry Duplikate erzeugen, wenn der erste Versuch doch erfolgreich war.
Zeigen Sie die Correlation-ID dem Nutzer (damit der Support sie erfragen kann) und loggen Sie sie immer serverseitig zusammen mit Code und relevanten Details. So lässt sich ein Fehler über Services und Clients hinweg nachverfolgen; in AppMaster-Projekten hilft es, diese Struktur zentral zu halten, damit Backend, Web und native Mobile gleich reagieren.


