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ındaShutdownOnSuccess: Hiçbir alt görev başarılı olmazsaresult()ç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
InterruptedExceptionfı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()veyaresult()ç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
joinUntilgrup 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
- Yapılandırılmış Eşzamanlılık Modeli
- StructuredTaskScope
- Başarıda ve Başarısızlıkta Kapatma
- Hata İşleme ve İptal