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 oluşturmayı ve fırlatmayı bildiğinize göre, onları nasıl yakalayacağınızı öğrenmeniz gerekiyor. try-catch-finally yapısı, istisnaların uygulamanızı çökertmesine izin vermek yerine onları zarif bir şekilde yönetmenizi sağlar.
İstisna fırlatabilecek kodu bir try bloğuna sarın, ardından istisnayı bir catch bloğunda ele alın:
<?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ğu ile farklı istisna türlerini yakalayabilirsiniz. PHP bunları sırayla kontrol eder, bu nedenle daha spesifik istisnaları ilk sıraya yerleştirin:
<?php
try {
// riskli kod
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
finally bloğu, bir istisna fırlatılıp fırlatılmadığına veya yakalanıp yakalanmadığına bakılmaksızın ç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 temizleme işlemleri için güvenilir kılar.
Görev
KolayHataları düzgün bir şekilde yönetirken temizleme işlemlerinin her zaman gerçekleşmesini sağlamak için try-catch-finally yapısının birlikte nasıl çalıştığını gösteren bir dosya işleme sistemi oluşturalım.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
FileException.php—Exceptionsınıfını genişleten özel birFileExceptionsınıfı oluşturun. Bu, sisteminizdeki dosya ile ilgili hataları temsil edecektir.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:falseolarak başlatılmış özel (private) bir boolean özellik:$isOpen$isOpendeğerinitrueyapan ve"Opening: [filename]"yazdıran biropen(string $filename): voidmetodu. Eğer dosya adı"invalid.txt"ise,"Cannot open file"mesajıyla birFileExceptionfırlatın"Processing file..."yazdıran birprocess(): voidmetodu. Eğer$isOpendeğerifalseise,"File not open"mesajıyla birRuntimeExceptionfırlatın$isOpendeğerinifalseyapan ve"File closed"yazdıran birclose(): voidmetodu- 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 şunları yapmak için birtry-catch-finallyyapısı kullanın:trybloğunda: dosya adıylaopen()metodunu çağırın, ardındanprocess()metodunu çağırın- Önce
FileExceptionhatasını yakalayın ve"File error: [message]"yazdırın RuntimeExceptionhatasını yakalayın ve"Runtime error: [message]"yazdırınfinallybloğunda:isOpen()kullanarak dosyanın açık olup olmadığını kontrol edin ve eğer açıksaclose()metodunu çağırın. Ardından"Cleanup complete"yazdırın
finally bloğu, işlemler başarılı olsa da başarısız olsa da temizleme işleminin gerçekleşmesini sağlar. Bu desen; dosyalar, veritabanı bağlantıları veya ağ soketleri gibi, işlem sırasında ne olursa olsun temizleme işleminin mutlaka yapılması gereken kaynakları yönetmek için temeldir.
Kendin dene
<?php
require_once 'FileProcessor.php';
// Girdiyi oku
$filename = trim(fgets(STDIN));
// TODO: Bir FileProcessor örneği oluşturun
// TODO: try-catch-finally yapısını kullanın:
// - try bloğunda: dosya adıyla open() metodunu çağırın, ardından process() metodunu çağırın
// - Önce FileException'ı yakalayın ve "File error: [message]" yazdırın
// - RuntimeException'ı yakalayın ve "Runtime error: [message]" yazdırın
// - finally bloğunda: isOpen() kullanarak dosyanın açık olup olmadığını kontrol edin, eğer öyleyse close() metodunu çağırın
// Ardından "Cleanup complete" yazdırın
?>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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon11Tip Sistemi ve Hata Yönetimi
Tip BildirimleriNullable TiplerBirleşim ve Kesişim Tipleriİstisna SınıflarıÖzel İstisna HiyerarşisiTry, Catch, FinallyÖzet - Form Doğrulayıcı3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi