0Pricing
Java Academy · Ders

Hata İşleme ve İptal

Başarısızlıkları temiz biçimde iletin

Hata İşleme ve İptal, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Görev Ağacındaki Başarısızlıklar

Alt görevler eşzamanlı çalışırken herhangi bir dalda hatalar oluşabilir. Yapılandırılmış eşzamanlılık, bu başarısızlıkları üst göreve aktarmak için düzenli bir yol sunar.

Bu derste istisnalar, iptal, kesintiye uğratma ve zaman aşımları ele alınır.

İstisnaların Ortaya Çıktığı Yer

İstisna fırlatan bir alt görev programınızı hemen çökertmez. İstisna, Subtask tanıtıcısında yakalanır. İstisnanın nerede ortaya çıkacağı kullanılan ilkeye bağlıdır:

  • ShutdownOnFailure: throwIfFailed() çağrısında
  • ShutdownOnSuccess: Hiçbir alt görev başarılı olmazsa result() çağrısında

throwIfFailed ile Aktarma

Burada bir alt görev başarısız olur. throwIfFailed(), istisnayı ExecutionException içine sararak yeniden fırlatır; biz de bunu main içinde yakalarız.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> "ok");
            scope.fork(() -> { throw new RuntimeException("boom"); });
            scope.join();
            scope.throwIfFailed();
            System.out.println("never reached");
        } catch (ExecutionException e) {
            System.out.println("Caught cause: " + e.getCause().getMessage());
        }
    }
}

Özel Bir İstisnaya Dönüştürme

throwIfFailed, nedeni kendi istisna türünüzün içine sarmak için bir işlev kabul eder ve API'nizin temiz kalmasını sağlar.

import java.util.concurrent.StructuredTaskScope;

class DataAccessException extends Exception {
    DataAccessException(Throwable cause) { super(cause); }
}

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> { throw new RuntimeException("db down"); });
            scope.join();
            scope.throwIfFailed(DataAccessException::new);
        } catch (DataAccessException e) {
            System.out.println("Wrapped: " + e.getCause().getMessage());
        }
    }
}

Otomatik İptal

ShutdownOnFailure altında bir alt görev başarısız olduğunda kapsam, iş parçacıklarını kesintiye uğratarak kardeş alt görevleri iptal eder. Herhangi bir iptal kodunu kendiniz yazmanız gerekmez.

Bu, boşa yapılan çalışmayı ve başıboş görevleri önler.

Kesintiye Uğratma Mekanizmadır

İptal, alt görevin sanal iş parçacığını kesintiye uğratarak çalışır. İşbirlikçi kod şunları yapmalıdır:

  • Engelleyici çağrıların InterruptedException fırlatmasına izin verin
  • Uzun döngülerde Thread.currentThread().isInterrupted() durumunu düzenli aralıklarla denetleyin

Kesintiye Uğramaya Yanıt Verme

Bu görev, kapsam kapandığında erken durabilmek için bir döngü içinde kesinti bayrağını denetler.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().start(() -> {
            long count = 0;
            while (!Thread.currentThread().isInterrupted()) {
                count++;
                if (count == 1_000_000) break;
            }
            System.out.println("Stopped after " + count + " iterations");
        });
        t.join();
    }
}

joinUntil ile Son Tarihler

Toplam süreyi sınırlamak için joinUntil(Instant) kullanın. Son tarih, tüm alt görevler tamamlanmadan geçerse TimeoutException oluşturulur ve kapsam geri kalanları kapatır.

Zaman Aşımlı Örnek Yapısı

Tipik bir zaman aşımıyla sınırlandırılmış iş dağıtımı şöyle görünür. Son tarih her bir alt göreve ayrı ayrı değil, grubun tamamına uygulanır.

import java.time.*;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            scope.fork(() -> "fast");
            scope.joinUntil(Instant.now().plus(Duration.ofSeconds(2)));
            scope.throwIfFailed();
            System.out.println("Completed within deadline");
        } catch (TimeoutException e) {
            System.out.println("Deadline exceeded");
        } catch (ExecutionException e) {
            System.out.println("A subtask failed");
        }
    }
}

join Sonrasında Her Zaman Yeniden Denetleyin

İzlenmesi gereken yöntem şudur: join() veya joinUntil sonrasında, herhangi bir alt görev değerine güvenmeden önce her zaman throwIfFailed() çağırın veya result() okuyun. Bunu atlamak başarısızlıkları gizleyebilir.

Temiz Kapanma Garantisi

Kapsamın nasıl sona erdiğinden bağımsız olarak—normal şekilde, başarısızlık nedeniyle veya zaman aşımıyla—kaynakları otomatik yöneten try bloğunun kapanması, her alt görev iş parçacığının tamamlanmasını garanti eder. Sızıntı veya sahipsiz görev yoktur.

Hızlı Kontrol

Kardeş alt görevlerin nasıl durdurulduğunu hatırlayın.

Özet

Hata işlemeyi ve iptali öğrendiniz:

  • İstisnalar throwIfFailed() veya result() çağrısında ortaya çıkar
  • Nedenleri throwIfFailed(mapper) aracılığıyla özel istisnalara dönüştürün
  • İptal, iş parçacığı kesintisi aracılığıyla çalışır; işbirlikçi görevler yazın
  • joinUntil grup için bir son tarih uygular
  • Kapsamın kapatılması her zaman temizleme işlemini gerçekleştirir

Yapılandırılmış Eşzamanlılık kursu tamamlandı.

Sıkça Sorulan Sorular

“Hata İşleme ve İptal” dersi ücretsiz mi?

Evet — “Hata İşleme ve İptal” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Hata İşleme ve İptal” dersinde ne öğreneceğim?

Başarısızlıkları temiz biçimde iletin Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Hata İşleme ve İptal” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yapılandırılmış Eşzamanlılık Modeli
  2. StructuredTaskScope
  3. Başarıda ve Başarısızlıkta Kapatma
  4. Hata İşleme ve İptal
← Java Academy Sayfasına Dön