Try, Catch, Finally
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 68 / 91.
Artık istisnaları nasıl oluşturacağınızı ve fırlatacağınızı bildiğinize göre, onları nasıl yakalayacağınızı öğrenmeniz gerekiyor. try-catch-finally yapısı, istisnaların uygulamanızın çökmesine neden olmasına izin vermek yerine onları düzgün bir şekilde işlemenizi sağlar.
İstisna oluşturabilecek kodu bir try bloğuna sarın, ardından istisnayı bir catch bloğunda işleyin:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
Çıktı:
Error: Cannot divide by zeroBirden fazla catch bloğuyla farklı istisna türlerini yakalayabilirsiniz. PHP bunları sırayla denetler; bu nedenle daha özel istisnaları önce yerleştirin:
<?php
try {
// riskli kod
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
Bir istisnanın oluşturulup oluşturulmadığına veya yakalanıp yakalanmadığına bakılmaksızın finally bloğu çalışır. Bağlantıları kapatmak gibi temizleme görevleri için mükemmeldir:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
Çıktı:
Attempting operation
Caught: Failed
Cleanup completefinally bloğu, try veya catch bloklarının içinden return yapsanız bile çalışır; bu da onu temel temizlik işlemleri için güvenilir kılar.
Görev
KolayHataları düzgün bir şekilde ele alırken temizleme işleminin her zaman gerçekleşmesini sağlayan try-catch-finally yapısının birlikte nasıl çalıştığını gösteren bir dosya işleme sistemi oluşturalım.
Kodunuzu üç dosyaya ayıracaksınız:
FileException.php:FileExceptionsınıfını genişleten özel birExceptionsınıfı oluşturun. Bu sınıf, sisteminizde dosyayla ilgili hataları temsil edecek.FileProcessor.php: Dosya işlemlerini simüle eden birFileProcessorsınıfı oluşturun. FileException dosyasını dahil edin. Sınıfınız şunlara sahip olmalıdır:$isOpenolarak başlatılmış özel bir boolean özelliğifalseopen(string $filename): voiddeğerini$isOpenolarak ayarlayan vetrueyazdıran bir"Opening: [filename]"metodu. Dosya adı"invalid.txt"ise,FileExceptionmesajıyla bir"Cannot open file"fırlatınprocess(): voidyazdıran bir"Processing file..."metodu.$isOpendeğerifalseise,RuntimeExceptionmesajıyla bir"File not open"fırlatınclose(): voiddeğerini$isOpenolarak ayarlayan vefalseyazdıran bir"File closed"metodu- Mevcut durumu döndüren bir
isOpen(): boolmetodu
main.php: FileProcessor dosyasını dahil edin. Bir girdi alacaksınız: bir dosya adı.Bir
FileProcessoroluşturun ve aşağıdakileri gerçekleştirmek için birtry-catch-finallyyapısı kullanın:trybloğunda: dosya adıylaopen()metodunu çağırın, ardındanprocess()metodunu çağırın- Önce
FileExceptionyakalayın ve"File error: [message]"yazdırın RuntimeExceptionyakalayın ve"Runtime error: [message]"yazdırınfinallybloğunda:isOpen()kullanarak dosyanın açık olup olmadığını kontrol edin ve açıksaclose()metodunu çağırın. Ardından"Cleanup complete"yazdırın
finally bloğu, işlemler başarılı veya başarısız olsa da temizleme işleminin gerçekleşmesini sağlar. Bu kalıp; işleme sırasında ne olduğundan bağımsız olarak temizleme işleminin gerçekleşmesi gereken dosyalar, veritabanı bağlantıları veya ağ yuvaları gibi kaynakları yönetmek için gereklidir.
Kendin dene
<?php
require_once 'FileProcessor.php';
// Girdiyi oku
$filename = trim(fgets(STDIN));
// TODO: Bir FileProcessor örneği oluştur
// TODO: try-catch-finally yapısını kullan:
// - try bloğunda: filename ile open() çağır, sonra process() çağır
// - Önce FileException yakala ve "File error: [message]" yazdır
// - RuntimeException yakala ve "Runtime error: [message]" yazdır
// - finally bloğunda: isOpen() kullanarak dosyanın açık olup olmadığını kontrol et, öyleyse close() çağır
// Then print "Cleanup complete"
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon11Tür Sistemi ve Hata Yönetimi
Tür BildirimleriNullable TürlerBirleşim ve Kesişim Türleriİstisna SınıflarıÖzel İstisna HiyerarşisiTry, Catch, FinallyTekrar - Form Doğrulayıcı3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi