# Fehlerbehandlung

Fehler bei Flughafendaten im Produktivbetrieb behandeln – 404-Semantik, Validierungsfehler und Fallback-Strategien.



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

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

**Fehlerbeispiele der Endpoints:** [Flughäfen](/docs/v31/airports#error-responses) · [Flughafensuche](/docs/v31/airport-search#error-responses) · [Navaids](/docs/v31/navaids#error-responses).

### Flughafenabfrage (`/airports/search`) [#airport-lookup-airportssearch]

Zwei unterschiedliche Ergebnisse — gleiche HTTP-Form (`{ "detail": "..." }`), unterschiedliche Bedeutung:

**404 — ICAO nicht gefunden.** Der Code ist unbekannt oder nicht in der Datenbank. Häufig bei privaten Landepisten, stillgelegten Flugplätzen und Tippfehlern. Zeigen Sie **Flughafen nicht gefunden** an und fordern Sie den Benutzer auf, den ICAO-Code zu überprüfen.

**400 — weder ICAO noch IATA angegeben.** Der Endpoint erfordert mindestens eine Kennung. Validieren Sie vor dem Aufruf — ein leerer Query-String erzeugt `400`, nicht `404`.

```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_airport(icao: str) -> dict | None:
    """Return airport data or None on 404. Raises on any other error."""
    if not icao:
        raise ValueError("ICAO code is required")
    r = requests.get(
        f"{BASE}/airports/search",
        headers=HEADERS,
        params={"icao": icao},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()
```

Ein `404` bedeutet, dass der Flughafen nicht gefunden wurde — kein Fehler im Client. Zeigen Sie einen leeren Zustand an und lassen Sie den Benutzer es mit einem anderen Code erneut versuchen.

### Textsuche (`/airports/search/text`) [#text-search-airportssearchtext]

| Bedingung                              | Verhalten                                          |
| -------------------------------------- | -------------------------------------------------- |
| Suchbegriff kürzer als 2 Zeichen       | `422 Unprocessable Entity`                         |
| Gültiger Suchbegriff, keine Treffer    | `200` mit `airports: []`                           |
| Gültiger Suchbegriff, Treffer gefunden | `200` mit nach Relevanz sortiertem `results`-Array |

Eine leere `airports`-Liste ist **kein** Fehler — sie bedeutet, dass kein Flughafen zum Suchbegriff passte. Zeigen Sie einen Zustand „Keine Ergebnisse“ statt eines Fehlerbanners an.

```python
def search_airports(query: str) -> list[dict]:
    """
    Returns a list of matching airports (may be empty).
    Raises ValueError for queries shorter than 2 characters.
    """
    if len(query) < 2:
        raise ValueError(f"Query must be at least 2 characters (got {len(query)!r})")
    r = requests.get(
        f"{BASE}/airports/search/text",
        headers=HEADERS,
        params={"q": query},
        timeout=(10, 15),
    )
    r.raise_for_status()
    return r.json().get("airports") or []
```

### Navaid-Abfrage (`/navaids`) [#navaid-lookup-navaids]

| Bedingung                                    | Verhalten               |
| -------------------------------------------- | ----------------------- |
| Flughafen hat keine veröffentlichten Navaids | `200` mit `navaids: []` |
| Ungültiger Begrenzungsrahmen                 | `400`                   |

Ein leeres `navaids`-Array ist normal — viele kleinere Flughäfen haben keine veröffentlichten Navaids. Zeigen Sie eine Anzahl von null statt eines Fehlers an.

```python
def fetch_navaids(icao: str) -> list[dict]:
    """Returns navaids for an airport. Empty list is a valid result."""
    r = requests.get(
        f"{BASE}/navaids",
        headers=HEADERS,
        params={"airport": icao},
        timeout=(10, 15),
    )
    r.raise_for_status()
    return r.json().get("navaids") or []
```

***

### Lauffähiges Beispiel [#runnable-example]

```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_airport(icao: str) -> dict | None:
    r = requests.get(
        f"{BASE}/airports/search",
        headers=HEADERS,
        params={"icao": icao},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def search_airports(query: str) -> list[dict]:
    if len(query) < 2:
        print(f"  [skip] query {query!r} is too short (min 2 chars)")
        return []
    r = requests.get(
        f"{BASE}/airports/search/text",
        headers=HEADERS,
        params={"q": query},
        timeout=(10, 15),
    )
    r.raise_for_status()
    return r.json().get("airports") or []


def fetch_navaids(icao: str) -> list[dict]:
    r = requests.get(
        f"{BASE}/navaids",
        headers=HEADERS,
        params={"airport": icao},
        timeout=(10, 15),
    )
    r.raise_for_status()
    return r.json().get("navaids") or []


if __name__ == "__main__":
    # 1. Fetch a known airport
    airport = fetch_airport("KJFK")
    if airport:
        print(f"Airport: {airport.get('name')} ({airport.get('icao_code')})")
    else:
        print("Airport KJFK not found")

    # 2. Try a 1-char query — gracefully skipped
    results = search_airports("K")
    print(f"1-char search results: {len(results)}")

    # 3. Valid text search
    results = search_airports("Kennedy")
    print(f"Text search 'Kennedy': {len(results)} result(s)")

    # 4. Fetch navaids — empty array is valid
    navaids = fetch_navaids("KJFK")
    print(f"Navaids at KJFK: {len(navaids)}")
```

Für vorübergehende Fehler (`429`, `5xx`) verwenden Sie den Retry-Helper unter [Fehlerbehandlung](/docs/errors#retry-rules).

***

Siehe auch: [Flughäfen](/docs/v31/airports-integration) · [Flughafensuche](/docs/v31/airport-search-integration) · [Navaids](/docs/v31/navaids-integration) · [Caching & Monitoring](/docs/v31/airport-data-integration-production)
