# Fehlerbehandlung

Fehlende METAR- und TAF-Daten im Produktivbetrieb behandeln – Bedeutung von 404, Fallbacks und Verweise auf die Fehlerbehandlung der Plattform.



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

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

**Beispiele für endpoint-spezifische `404`-Fehler:** [METAR](/docs/v31/weather-metar#error-responses) · [TAF](/docs/v31/weather-taf#error-responses) · [Höhenwinde](/docs/v31/winds-aloft#error-responses).

### Wenn Wetterdaten fehlen [#when-weather-data-is-missing]

Zwei unterschiedliche `404`-Fälle - gleicher HTTP-Status und gleiche JSON-Struktur (`{ "detail": "..." }`), aber unterschiedliche Bedeutung:

**[METAR](https://en.wikipedia.org/wiki/METAR) 404.** Für diesen ICAO-Code gibt es keine Wetterbeobachtungsstation. Das ist häufig bei privaten Landeplätzen, vielen Militärflugplätzen und einigen internationalen Flughäfen der Fall, die nicht an das ASOS/AWOS-Netz melden. Der Flughafen kann trotzdem existieren - er meldet lediglich keine [METARs](https://en.wikipedia.org/wiki/METAR). Zeigen Sie **Wetter nicht verfügbar** an und lassen Sie Benutzer gegebenenfalls fortfahren.

**[TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast) 404.** Der Flughafen hat möglicherweise ein [METAR](https://en.wikipedia.org/wiki/METAR), aber es wird kein [TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast) herausgegeben. Kleinere Flughäfen ohne nennenswerten Instrumentenflugverkehr haben oft nur ein [METAR](https://en.wikipedia.org/wiki/METAR). Rufen Sie das [METAR](https://en.wikipedia.org/wiki/METAR) wie gewohnt ab, überspringen Sie das [TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast) und zeigen Sie nur die aktuellen Bedingungen an.

```python
import requests

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


def get_weather(icao: str) -> dict:
    """
    Returns a dict with 'metar' and 'taf' keys.
    Either can be None if data is unavailable for this airport.
    """
    result = {"metar": None, "taf": None}

    r = requests.get(f"{BASE}/weather/metar/{icao}", headers=HEADERS, params={"parsed": "true"}, timeout=(10, 15))
    if r.status_code == 200:
        result["metar"] = r.json()
    elif r.status_code != 404:
        r.raise_for_status()

    r = requests.get(f"{BASE}/weather/taf/{icao}", headers=HEADERS, params={"parsed": "true"}, timeout=(10, 15))
    if r.status_code == 200:
        result["taf"] = r.json()
    elif r.status_code != 404:
        r.raise_for_status()

    return result


# weather = get_weather("KOXB")  # small airport, no TAF
# print("METAR:", "available" if weather["metar"] else "not available")
# print("TAF:",   "available" if weather["taf"]   else "not available")
```

Stellen Sie verfügbare [METAR](https://en.wikipedia.org/wiki/METAR)/[TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast)-Daten dar und kennzeichnen Sie Lücken ausdrücklich (zum Beispiel „Keine Vorhersage für diesen Flughafen“). Ein Wetter-`404` bedeutet, dass das **Produkt** für diesen ICAO-Code **nicht veröffentlicht wird**, und nicht, dass ein Fehler im Client vorliegt.

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

### En-Route-Endpoints (bbox) [#en-route-endpoints-bbox]

[Höhenwinde](/docs/v31/winds-aloft), [PIREPs](/docs/v31/pireps) und [AIRMET/SIGMET](/docs/v31/airsigmet) verwenden eine `bbox`-Abfrage - keinen einzelnen ICAO-Code. Die Fehlersemantik unterscheidet sich von [METAR](https://en.wikipedia.org/wiki/METAR)/[TAF](https://en.wikipedia.org/wiki/Terminal_aerodrome_forecast):

| Endpoint          | Leeres Ergebnis           | `404`                          | Hinweise                                                  |
| ----------------- | ------------------------- | ------------------------------ | --------------------------------------------------------- |
| **Höhenwinde**    | -                         | Keine FB-Stationen in der bbox | Nur US-Abdeckung - bbox erweitern oder Koordinaten prüfen |
| **PIREPs**        | `reports: []`, `total: 0` | - (`400` bei ungültiger bbox)  | Keine aktuellen Pilotenmeldungen - **kein** Fehler        |
| **AIRMET/SIGMET** | `reports: []`, `total: 0` | - (`400` bei ungültiger bbox)  | Keine aktiven Warnmeldungen - häufig bei VFR-Wetter       |

```python
import requests

HEADERS = {
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
BBOX = "39,-80,42,-73"  # example corridor


def enroute_weather(bbox: str) -> dict:
    """Fetch en-route layers. Empty lists are valid - do not treat as failures."""
    out = {"winds": None, "pireps": [], "airsigmets": []}

    r = requests.get(
        f"{BASE}/weather/winds-aloft",
        headers=HEADERS,
        params={"bbox": bbox, "forecast": 12, "level": "low"},
        timeout=(10, 20),
    )
    if r.status_code == 200:
        out["winds"] = r.json()
    elif r.status_code != 404:
        r.raise_for_status()

    r = requests.get(
        f"{BASE}/weather/pireps",
        headers=HEADERS,
        params={"bbox": bbox, "hours": 3},
        timeout=(10, 20),
    )
    r.raise_for_status()
    out["pireps"] = r.json().get("reports") or []

    r = requests.get(
        f"{BASE}/weather/airsigmet",
        headers=HEADERS,
        params={"bbox": bbox, "type": "airmet"},
        timeout=(10, 25),
    )
    r.raise_for_status()
    out["airsigmets"] = r.json().get("reports") or []

    return out


# wx = enroute_weather(BBOX)
# print("Winds stations:", wx["winds"]["total"] if wx["winds"] else "none in bbox")
# print("PIREPs:", len(wx["pireps"]))
# print("AIRMETs:", len(wx["airsigmets"]))
```

Zeigen Sie in der UI ausdrückliche Leerzustände an („Keine Pilotenmeldungen in den letzten 3 h“, „Keine aktiven [AIRMETs](https://www.aviationweather.gov/help/data/#airmet)“) statt Fehlerbannern.

***

Siehe auch: [METAR](/docs/v31/weather-metar) · [TAF](/docs/v31/weather-taf) · [Höhenwinde](/docs/v31/winds-aloft) · [PIREPs](/docs/v31/pireps) · [AIRMET/SIGMET](/docs/v31/airsigmet) · [Muster für den Produktivbetrieb](/docs/v31/weather-integration-production) · [Anwendungsfälle am Flughafen](/docs/v31/weather-integration-airport) · [Anwendungsfälle auf der Strecke](/docs/v31/weather-integration-enroute)
