Penanganan Error dan Alur HTTP Async
Tangani error dengan exceptionally, handle, dan whenComplete, lalu bangun alur klien HTTP async.
Penanganan Error dan Alur HTTP Async adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Mengapa Penanganan Kesalahan Asinkron Penting
Dalam alur asinkron, pengecualian tidak diteruskan dengan cara yang sama seperti dalam kode sinkron. Anda harus menangani kesalahan secara eksplisit menggunakan exceptionally, handle, atau whenComplete.
exceptionally: Memulihkan dari Galat
exceptionally(Function<Throwable, T>) dipanggil hanya jika proses asinkron selesai dengan pengecualian. Fitur ini menyediakan nilai cadangan agar alur tetap berjalan.
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: Mengubah Keberhasilan dan Kegagalan
handle(BiFunction<T, Throwable, U>) dipanggil baik saat berhasil maupun gagal. Salah satu dari kedua argumen tersebut akan bernilai null.
fetchUser(id).handle((user, ex) -> {
if (ex != null) return UserDto.empty();
return UserDto.from(user);
}).thenAccept(dto -> sendResponse(dto));whenComplete: Efek Samping Setelah Hasil Apa Pun
whenComplete(BiConsumer) dipanggil setelah proses selesai, apa pun hasilnya. Fitur ini tidak mengubah hasil—gunakan untuk pencatatan, metrik, atau pembersihan.
fetchUser(id)
.whenComplete((user, ex) -> {
if (ex != null) metrics.increment("user.fetch.error");
else metrics.increment("user.fetch.success");
})
.thenAccept(u -> sendResponse(u));Mencoba Ulang Proses Asinkron yang Gagal
Terapkan logika percobaan ulang dengan memanggil operasi secara rekursif saat terjadi kegagalan, hingga mencapai jumlah percobaan maksimum.
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);
});
}HttpClient Java 11: GET Asinkron
Java 11 menyediakan HTTP asinkron sepenuhnya melalui HttpClient, yang mengembalikan CompletableFuture<HttpResponse<String>>.
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);Merangkai Beberapa Panggilan HTTP
Gunakan thenCompose untuk merangkai panggilan HTTP yang saling bergantung: pertama-tama ambil pengguna, lalu gunakan ID pengguna tersebut untuk mengambil pesanannya.
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()));Panggilan HTTP Paralel dengan allOf
Kirim permintaan ke beberapa titik akhir secara paralel, lalu kumpulkan semua respons setelah semuanya selesai.
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();Batas Waktu pada Panggilan HTTP
Terapkan orTimeout langsung pada panggilan HTTP asinkron untuk membatalkannya jika server membutuhkan waktu terlalu lama.
CompletableFuture<String> result = client
.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.orTimeout(5, TimeUnit.SECONDS)
.thenApply(HttpResponse::body)
.exceptionally(ex -> "timeout or error");Validasi Kode Status dalam Alur
Gunakan thenApply untuk memeriksa kode status HTTP dan melempar pengecualian domain jika kode tersebut menunjukkan galat, sehingga penanganan galat dalam alur tetap konsisten.
.thenApply(response -> {
if (response.statusCode() != 200)
throw new HttpResponseException(response.statusCode());
return response.body();
})Menggabungkan Pemulihan Galat dan Pencatatan
Gunakan whenComplete untuk pencatatan dan exceptionally untuk pemulihan dalam alur yang sama—keduanya dapat dirangkai dengan baik.
fetchData()
.whenComplete((r, ex) -> { if (ex != null) log.error("Failed", ex); })
.exceptionally(ex -> fallback())
.thenAccept(result -> process(result));Pemeriksaan Singkat
Metode CompletableFuture mana yang dipanggil ONLY saat proses asinkron gagal?
Rangkuman
Gunakan exceptionally untuk nilai cadangan, handle untuk mengubah kedua hasil, dan whenComplete untuk efek samping. Bangun alur HTTP asinkron dengan HttpClient Java 11 + thenCompose + allOf.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penanganan Error dan Alur HTTP Async” gratis?
Ya — teks lengkap “Penanganan Error dan Alur HTTP Async” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Penanganan Error dan Alur HTTP Async”?
Tangani error dengan exceptionally, handle, dan whenComplete, lalu bangun alur klien HTTP async. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Penanganan Error dan Alur HTTP Async” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat dan Menyelesaikan CompletableFutures
- Merangkai dengan thenApply dan thenCompose
- Menggabungkan Future: allOf dan anyOf
- Penanganan Error dan Alur HTTP Async