Unified Error Handling macht aus jedem Fehler eine vorhersehbare Form
Rohe APIs sind sich uneins, wo ein Fehler steht, wie er heißt und ob sich ein Retry lohnt. Maesn liefert einen Umschlag mit standardisierter Kategorie, fängt ungültige Eingaben ab, bevor sie gesendet werden, und reicht den Fehler des Zielsystems unverändert durch.
"errors": {
"type": "target_system_error",
"statusCode": 400,
"downstreamErrors": [{
"statusCode": 500,
"message": "Unknown currency"
}]
}Was ist Unified Error Handling
Anbindungen werden danach beurteilt, wie sie sich verhalten, wenn etwas schiefgeht, nicht wenn alles läuft. Der Normalfall ist die leichte Hälfte: Sie bauen ihn an einem Nachmittag gegen ein System. Die andere Hälfte ist, um drei Uhr nachts zu wissen, ob ein gescheiterter Abgleich eine fehlerhafte Nutzlast bedeutet, einen Kunden, der den Zugriff entzogen hat, einen Endpunkt, den es für dieses System nie gab, oder einen Hersteller mit einer schlechten Stunde, und welches davon einen zweiten Versuch wert ist.
Unified Error Handling ist die Ebene, die das beantwortbar macht. Ein Umschlag, eine standardisierte Menge von Kategorien und eine dokumentierte Retry-Regel, über jedes System hinweg, Ihre Fehlerbehandlung wird also einmal geschrieben. Sie stützt sich auf dieselbe Normalisierung wie das Common Data Model: Weil Maesn weiß, wie ein gültiges Objekt aussieht, kann es ein fehlerhaftes abweisen, bevor ein System es sieht.
Jedes System scheitert in seinem eigenen Dialekt
Scheitern ist das am wenigsten standardisierte Verhalten jeder API und das, dem Sie unter dem größten Druck begegnen. Vier Fragen, vier verschiedene Antworten je System.
Ein Umschlag, sechs nützliche Felder
Fehler kommen in einem einzigen Objekt auf oberster Ebene an, jedes Mal mit denselben Feldern. Zwei davon sind der Grund, warum das mehr ist als kosmetische Normalisierung.
Eine Kategorie, kein Satz
Jeder Fehler trägt einen standardisierten type, sodass Ihr Code auf die Fehlerart verzweigt statt Strings zu vergleichen.
Gefangen vor dem Senden
Maesn prüft zuerst Feldformate, Pflichtwerte und Datentypen, sodass ungültige Eingaben früh scheitern und das Feld benannt wird.
Downstream-Fehler erhalten
Weist ein Zielsystem eine Anfrage ab, kommen seine ursprüngliche Meldung und sein Status unverändert durch.
Retry-Regel je Code
Welche Antworten eine Wiederholung wert sind, welche nicht und wie lange zu warten ist, steht dokumentiert statt im Ausprobieren.
"errors": {"type": "invalid_parameters","statusCode": 400,"message": "Invalid parameters, please checkthe validationErrors array.","context": {"targetSystem": "snelstart","unifiedApi": "Accounting"},"validationErrors": ["Contact type must be COMPANY."]}
Das Gewicht tragen statusCode und downstreamErrors, und das eine ist genau deshalb normalisiert, damit das andere es nicht sein muss. HTTP ist genau darin, welcher Code zu welcher Lage gehört, und Systeme setzen das so lose um wie alles andere: Ein Validierungsfehler, den keine Wiederholung behebt, kommt von manchen Systemen als 500 zurück. Eine 500 sagt das Gegenteil, nämlich dass auf ihrer Seite etwas kaputtging und dieselbe Anfrage in zehn Minuten durchaus gelingen kann. Maesn antwortet mit dem Code, den die Lage wirklich verlangt, Ihre Retry-Logik liest also eine Kategorie statt eines Irrtums.
Den Code zu korrigieren würde Sie sonst das kosten, was darunter liegt, und das ist oft der einzig nützliche Teil: welches Feld abgewiesen wurde, was das System stattdessen erwartet hat, oder ein eigener Status, der nur dort etwas bedeutet. Das Original wird deshalb nicht ersetzt. Es reist neben dem korrigierten in downstreamErrors, und darum kann Ihre Anwendung auf die Kategorie verzweigen, während ein Entwickler die eigenen Worte des Systems liest, statt dass das eine gegen das andere getauscht wird.
Nicht jedes Problem antwortet mit einem Fehler. Ein Aufruf kann gelingen und trotzdem nicht alles tun, worum Sie gebeten haben, und das kommt als meta.warnings in der Antwort an: ein Feld, das das Zielsystem nicht nutzt, oder ein Wert, den es übergeht, weil es ihn nicht kennt, etwa eine Währung außerhalb der von ihm behandelten. Geschrieben ist das für die anbindenden Entwickler und nicht für den Endnutzer, und es trennt einen Schreibvorgang, der funktioniert hat, von einem, der so funktioniert hat, wie Sie es meinten.
Zehn Typen, fünf Entscheidungen
Das Feld type ist der Teil, gegen den zu bauen sich lohnt. Zehn standardisierte Werte decken jeden Fehler ab, den die Unified API erzeugt, und jeder verlangt eine andere Reaktion: beheben und erneut senden, den Kunden zum Neuverbinden bitten, aufhören, weil es den Endpunkt für dieses System nicht gibt, oder abwarten und später versuchen. Sie so zu gruppieren macht aus der Fehlerbehandlung statt eines Haufens Sonderfälle vier oder fünf Zweige, die Sie einmal schreiben.
Was es bewusst nicht tut, ist das Detail einzuebnen. Ein Rate-Limit eines Zielsystems kommt als eigener Typ an, statt in einem allgemeinen Fehlschlag aufzugehen, weil die richtige Reaktion sich von der auf einen Serverfehler unterscheidet und weil das Limit dem Zielsystem gehört und von Ihnen zu achten ist. Die Taktung läuft auf den asynchronen Endpunkten, bei einem synchronen Aufruf ist der Typ also das ganze Signal. Eine abgelaufene Verbindung kommt ebenfalls als eigener Typ an, denn die Lösung ist keine Wiederholung, sondern ein Kunde, der erneut durch die Authentifizierung geht.
Ihre Anfrage
Beheben und erneut senden
Berechtigung
Der Kunde verbindet neu
Nicht verfügbar
Nicht wiederholen, es erscheint nicht
Das Zielsystem
Den Downstream-Fehler lesen
Vorübergehend
Abwarten und wiederholen
Was Sie erneut versuchen, und was nie
Den falschen Fehler zu wiederholen verschwendet Verkehr und verdeckt einen echten Fehler. Den richtigen zu wiederholen ist oft der Unterschied zwischen einem gescheiterten und einem langsamen Abgleich.
Hier arbeiten zwei Ebenen, und es lohnt sich, sie auseinanderzuhalten, angefangen damit, dass die Tabelle darüber für Ihren Code geschrieben ist und nicht unseren beschreibt. Maesns Ebene ist die Einordnung: Der Fehler kommt mit einer Kategorie an, mit benanntem System und mit angehängter ursprünglicher Antwort, und ungültige Eingaben werden gefangen, bevor sie je ein System erreichen. Die Wiederholung liegt bei Ihnen. Maesn wiederholt und taktet auf den asynchronen Endpunkten, und bei einem synchronen Aufruf gehen die 429, 500 und 503 des Zielsystems direkt durch, damit Ihre Anwendung darauf reagiert. Dieselbe Warteschlange gibt die Anfragen eines Mandanten der Reihe nach frei, und das verhindert, dass sich zwei Token-Refreshes überschneiden und Ihren Kunden eine erneute Authentifizierung kosten.
Wenn Sie doch wissen müssen, was auf der Leitung wirklich geschah, sind die Anfrage, die Antwort und jedes Event darum herum aufgezeichnet, einen sporadischen Fehler zu untersuchen heißt also, ihn über Protokollierung und Monitoring nachzuschlagen statt ihn nachzustellen.
Ein Fehlerpfad, jedes System
- Je System eine andere Fehlerform parsen
- Raten, welche Fehler wiederholbar sind
- Die Originalmeldung unterwegs verlieren
- Ungültige Eingaben erst vom System erfahren
- Ein Umschlag mit echter Kategorie
- Retry-Regel je Antwortcode
- Downstream-Fehler durchgereicht
- Ungültige Eingaben vor dem Senden gefangen
Bei der Fehlerbehandlung verlieren Integrationsprojekte still ihre Marge. Nicht im ersten Bau, sondern im zweiten Jahr, wenn jedes neue System einem Support-Runbook, das niemand verantworten will, einen weiteren Fehlerdialekt hinzufügt und ein Kunde fragt, warum seine Rechnung nicht abgeglichen wurde. Weil Umschlag, Kategorien und Retry-Regel Maesns sind und nicht die jedes Herstellers, wird dieses Runbook einmal geschrieben und hört auf zu wachsen. Das System, das Ihr Kunde als nächstes wählt, ändert, welches Logo an der Verbindung steht, nicht wie Ihr Code mit einem schlechten Tag umgeht. Das Runbook, das aufhört zu wachsen, ist auch das, aus dem Customer-Success-Teams arbeiten müssen, wenn ein Kunde schon in der Leitung ist.
Häufige Fragen
Wie sieht ein Maesn-Fehler aus?
Warum zählt der standardisierte type?
Was sind Validierungsfehler?
Verliere ich den ursprünglichen Fehler des Systems?
Welche Fehler sollte ich wiederholen?
Was passiert bei einem Ausfall eines Zielsystems?
Woran erkenne ich, dass ein Wert übergangen statt abgewiesen wurde?
Was, wenn eine Verbindung abläuft?
Wie unterscheide ich einen nicht unterstützten von einem defekten Endpunkt?
Einmal bauen, auf der Unified API.
Sehen Sie, wie Unified Error Handling für Ihre Integration funktioniert, oder steigen Sie in die technische Referenz ein.











