Fehlerbehandlung und asynchrone HTTP-Pipeline
Behandeln Sie Fehler mit exceptionally, handle und whenComplete und erstellen Sie anschließend eine asynchrone HTTP-Client-Pipeline.
Fehlerbehandlung und asynchrone HTTP-Pipeline ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum asynchrone Fehlerbehandlung wichtig ist
In asynchronen Pipelines werden Ausnahmen nicht auf dieselbe Weise weitergegeben wie in synchronem Code. Sie müssen Fehler ausdrücklich mit exceptionally, handle oder whenComplete behandeln.
exceptionally: Wiederherstellung nach Fehlern
exceptionally(Function<Throwable, T>) wird nur aufgerufen, wenn das Future mit einer Exception abgeschlossen wird. Die Methode liefert einen Fallback-Wert und hält die Pipeline am Leben.
CompletableFuture<String> safe = fetchUser(id)
.thenApply(User::getName)
.exceptionally(ex -> {
log.warn("Fetch failed: " + ex.getMessage());
return "Anonymous";
});
System.out.println(safe.join()); // "Anonymous" if fetch failedhandle: Erfolg und Fehlschlag transformieren
handle(BiFunction<T, Throwable, U>) wird sowohl bei Erfolg als auch bei Fehlschlag aufgerufen. Eines der beiden Argumente ist jeweils null.
fetchUser(id).handle((user, ex) -> {
if (ex != null) return UserDto.empty();
return UserDto.from(user);
}).thenAccept(dto -> sendResponse(dto));whenComplete: Nebeneffekt nach jedem Ergebnis
whenComplete(BiConsumer) wird unabhängig vom Ergebnis nach dem Abschluss aufgerufen. Die Methode ändert das Ergebnis nicht – verwenden Sie sie für Logging, Metriken oder Aufräumarbeiten.
fetchUser(id)
.whenComplete((user, ex) -> {
if (ex != null) metrics.increment("user.fetch.error");
else metrics.increment("user.fetch.success");
})
.thenAccept(u -> sendResponse(u));Fehlgeschlagene Futures erneut versuchen
Implementieren Sie die Wiederholungslogik, indem Sie die Operation bei einem Fehlschlag rekursiv aufrufen, bis eine maximale Anzahl von Versuchen erreicht ist.
CompletableFuture<String> withRetry(Supplier<CompletableFuture<String>> task, int retries) {
return task.get().exceptionallyCompose(ex -> {
if (retries > 0) {
System.out.println("Retrying... " + retries);
return withRetry(task, retries - 1);
}
return CompletableFuture.failedFuture(ex);
});
}Java 11 HttpClient: Asynchroner GET-Aufruf
Der HttpClient von Java 11 stellt über sendAsync() vollständig asynchrones HTTP bereit und gibt ein CompletableFuture<HttpResponse<String>> zurück.
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users/1"))
.build();
CompletableFuture<String> body = client
.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body);Mehrere HTTP-Aufrufe verketten
Verwenden Sie thenCompose, um abhängige HTTP-Aufrufe zu verketten: Rufen Sie zuerst den Benutzer ab und verwenden Sie anschließend dessen ID, um seine Bestellungen abzurufen.
client.sendAsync(userReq, HttpResponse.BodyHandlers.ofString())
.thenApply(r -> parseUser(r.body()))
.thenCompose(user -> client.sendAsync(
buildOrdersRequest(user.getId()),
HttpResponse.BodyHandlers.ofString()))
.thenApply(r -> parseOrders(r.body()))
.thenAccept(orders -> System.out.println("Orders: " + orders.size()));Parallele HTTP-Aufrufe mit allOf
Rufen Sie mehrere Endpunkte parallel auf und sammeln Sie anschließend alle Antworten, sobald alle Aufrufe abgeschlossen sind.
List<URI> endpoints = List.of(uri1, uri2, uri3);
List<CompletableFuture<String>> requests = endpoints.stream()
.map(uri -> client.sendAsync(
HttpRequest.newBuilder(uri).build(),
HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body))
.collect(Collectors.toList());
List<String> responses = CompletableFuture
.allOf(requests.toArray(new CompletableFuture[0]))
.thenApply(v -> requests.stream().map(CompletableFuture::join).collect(Collectors.toList()))
.join();Timeouts bei HTTP-Aufrufen
Wenden Sie orTimeout direkt auf den asynchronen HTTP-Aufruf an, um ihn abzubrechen, wenn der Server zu lange benötigt.
CompletableFuture<String> result = client
.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.orTimeout(5, TimeUnit.SECONDS)
.thenApply(HttpResponse::body)
.exceptionally(ex -> "timeout or error");Statuscode-Validierung in der Pipeline
Verwenden Sie thenApply, um den HTTP-Statuscode zu prüfen und bei einem Fehler eine domänenspezifische Exception auszulösen. So bleibt die Fehlerbehandlung in der Pipeline konsistent.
.thenApply(response -> {
if (response.statusCode() != 200)
throw new HttpResponseException(response.statusCode());
return response.body();
})Fehlerwiederherstellung und Logging kombinieren
Setzen Sie whenComplete für das Logging und exceptionally für die Wiederherstellung in derselben Pipeline ein – beide Methoden lassen sich problemlos kombinieren.
fetchData()
.whenComplete((r, ex) -> { if (ex != null) log.error("Failed", ex); })
.exceptionally(ex -> fallback())
.thenAccept(result -> process(result));Schnelltest
Welche CompletableFuture-Methode wird NUR aufgerufen, wenn das Future fehlschlägt?
Zusammenfassung
Verwenden Sie exceptionally für Fallback-Werte, handle zum Transformieren beider Ergebnisse und whenComplete für Nebeneffekte. Bauen Sie asynchrone HTTP-Pipelines mit Java 11 HttpClient, thenCompose und allOf.
Häufig gestellte Fragen
Ist die Lektion „Fehlerbehandlung und asynchrone HTTP-Pipeline“ kostenlos?
Ja — der vollständige Text von „Fehlerbehandlung und asynchrone HTTP-Pipeline“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Fehlerbehandlung und asynchrone HTTP-Pipeline“?
Behandeln Sie Fehler mit exceptionally, handle und whenComplete und erstellen Sie anschließend eine asynchrone HTTP-Client-Pipeline. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Fehlerbehandlung und asynchrone HTTP-Pipeline“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- CompletableFutures erstellen und abschließen
- Verketten mit thenApply und thenCompose
- Futures kombinieren: allOf und anyOf
- Fehlerbehandlung und asynchrone HTTP-Pipeline