# Fehlerbehandlung

Fehler bei ML-Vorhersagen im Produktivbetrieb behandeln — nicht unterstützte Routen, Validierungsfehler und Fallbacks.



Caching und Monitoring: [Caching & Monitoring](/docs/v31/ml-integration-production).

**Plattformweite Fehler** (401, 403, 422, 429, 5xx, Wiederholungsversuche/Backoff, Rate-Limit-Header): [Fehlerbehandlung](/docs/errors).

### Flugzeit: 422 — nicht erkannte Flughafencodes [#flight-time-422--unrecognised-airport-codes]

`GET /ml/flight-time` prüft, ob sowohl `from` als auch `to` bekannten Flughäfen zugeordnet werden können. Ein unbekannter oder fehlerhafter Code liefert `422` mit einer Detailmeldung, die angibt, welcher Code fehlgeschlagen ist.

| Code  | Bedeutung                         | Lösung                                                                                                                                                                         |
| ----- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `422` | `from` oder `to` nicht erkannt    | Verwenden Sie einen gültigen ICAO-Code (4 Buchstaben, z. B. `KJFK`) oder IATA-Code (3 Buchstaben, z. B. `JFK`). Auflösung über die [Flughafensuche](/docs/v31/airport-search). |
| `404` | Keine Routendaten für dieses Paar | Dem Modell fehlen ausreichende historische Daten für dieses Städtepaar. Zeigen Sie „Schätzung nicht verfügbar.“ an.                                                            |

**Hinweis:** Das Ergebnis ist ein **statistischer Durchschnitt** auf Basis historischer Betriebsdaten — keine Echtzeitvorhersage. Wind und aktuelle Bedingungen auf der Strecke fließen nicht in das Modell ein. Weisen Sie darauf hin, wenn Sie Passagieren oder Flugplanern Schätzungen anzeigen.

```python
import os
import requests

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"


def fetch_flight_time(origin: str, destination: str, aircraft: str | None = None) -> dict | None:
    """
    Fetch ML flight time estimate. Returns None on 404 (no data for pair).
    Raises ValueError on 422 (invalid airport code).
    """
    params: dict[str, str] = {"from": origin, "to": destination}
    if aircraft:
        params["aircraft"] = aircraft
    r = requests.get(
        f"{BASE}/ml/flight-time",
        headers=HEADERS,
        params=params,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    if r.status_code == 422:
        detail = r.json().get("detail", "invalid airport code")
        raise ValueError(f"422 Unprocessable: {detail}")
    r.raise_for_status()
    return r.json()


# Valid request — KJFK to KLAX
if __name__ == "__main__":
    data = fetch_flight_time("KJFK", "KLAX", aircraft="B738")
    if data:
        print(
            f"Estimated: {data['estimated_hours_display']}  "
            f"({data['min_minutes']}–{data['max_minutes']} min range)"
        )
        print("Statistical average — actual time varies with winds and routing.")
    else:
        print("No estimate available for this route.")

    try:
        fetch_flight_time("ZZZZ", "KLAX")
    except ValueError as exc:
        print(f"Caught expected error: {exc}")
```

### CO₂: 422 — fehlende Pflichtparameter [#carbon-422--missing-required-parameters]

`GET /carbon/estimate` erfordert entweder ein Flughafenpaar (`departure_icao` + `arrival_icao`) **oder** ein `callsign`. Fehlen beide, wird `422` zurückgegeben.

| Code  | Bedeutung                                     | Lösung                                                                                                                                      |
| ----- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `422` | Weder Flughafenpaar noch `callsign` angegeben | Geben Sie `departure_icao` + `arrival_icao` oder ein `callsign` an.                                                                         |
| `422` | Nicht erkannter Flughafencode                 | Stellen Sie sicher, dass die ICAO-Codes gültige vierstellige Kennungen sind. Auflösung über die [Flughafensuche](/docs/v31/airport-search). |
| `404` | Keine Emissionsdaten für dieses Paar          | Die Route liegt außerhalb der Modellabdeckung. Zeigen Sie „Schätzung nicht verfügbar.“ an.                                                  |

**RFI-Hinweispflicht:** Mit `include_rfi=true` wird ein Multiplikator nach dem [Radiative Forcing Index](https://en.wikipedia.org/wiki/Radiative_forcing) (\~2×) auf den CO₂-Basiswert angewendet. Erscheint `rfi_applied: true` in der Antwort, weisen Sie in der Benutzeroberfläche darauf hin, dass der angezeigte Wert über CO₂ hinausgehende klimawirksame Effekte enthält (gemäß den Vorgaben von [ICAO Doc 9988](https://www.icao.int/environmental-protection/CarbonOffset/Pages/default.aspx)).

```python
import os
import requests

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"


def fetch_carbon(
    departure_icao: str | None = None,
    arrival_icao: str | None = None,
    callsign: str | None = None,
    passengers: int = 1,
    include_rfi: bool = False,
) -> dict | None:
    """
    Fetch carbon estimate. Requires departure_icao+arrival_icao or callsign.
    Returns None on 404. Raises ValueError on 422.
    """
    params: dict[str, str | int] = {
        "passengers": passengers,
        "include_rfi": str(include_rfi).lower(),
    }
    if departure_icao:
        params["departure_icao"] = departure_icao
    if arrival_icao:
        params["arrival_icao"] = arrival_icao
    if callsign:
        params["callsign"] = callsign

    r = requests.get(
        f"{BASE}/carbon/estimate",
        headers=HEADERS,
        params=params,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    if r.status_code == 422:
        detail = r.json().get("detail", "validation error")
        raise ValueError(f"422 Unprocessable: {detail}")
    r.raise_for_status()
    return r.json()


# 1. Attempt without required params — expect 422
if __name__ == "__main__":
    try:
        fetch_carbon()
    except ValueError as exc:
        print(f"Missing params error: {exc}")

    data = fetch_carbon(departure_icao="KJFK", arrival_icao="KLAX", passengers=1)
    if data:
        co2 = data.get("co2_kg_per_passenger", 0.0)
        rfi = data.get("rfi_applied", False)
        print(f"CO₂/passenger: {co2:.1f} kg  (RFI applied: {rfi})")
        if rfi:
            print(
                "Disclosure: figure includes radiative forcing effects "
                "(~2× base CO₂, ICAO Doc 9988)."
            )
    else:
        print("No estimate available for this route.")
```

Für vorübergehende Fehler (`429`, `5xx`) verwenden Sie die Hilfsfunktion für Wiederholungsversuche unter [Fehlerbehandlung](/docs/errors#retry-rules).

***

Siehe auch: [Flugzeit](/docs/v31/flight-time) · [CO₂-Emissionen](/docs/v31/carbon) · [Caching & Monitoring](/docs/v31/ml-integration-production) · [Fehlerbehandlung](/docs/errors)
