Menu
Coddy logo textTech

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 zero

Birden 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 complete

finally 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.

challenge icon

Görev

Kolay

Hataları 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: FileException sınıfını genişleten özel bir Exception sınıfı oluşturun. Bu sınıf, sisteminizde dosyayla ilgili hataları temsil edecek.
  • FileProcessor.php: Dosya işlemlerini simüle eden bir FileProcessor sınıfı oluşturun. FileException dosyasını dahil edin. Sınıfınız şunlara sahip olmalıdır:
    • $isOpen olarak başlatılmış özel bir boolean özelliği false
    • open(string $filename): void değerini $isOpen olarak ayarlayan ve true yazdıran bir "Opening: [filename]" metodu. Dosya adı "invalid.txt" ise, FileException mesajıyla bir "Cannot open file" fırlatın
    • process(): void yazdıran bir "Processing file..." metodu. $isOpen değeri false ise, RuntimeException mesajıyla bir "File not open" fırlatın
    • close(): void değerini $isOpen olarak ayarlayan ve false yazdıran bir "File closed" metodu
    • Mevcut durumu döndüren bir isOpen(): bool metodu
  • main.php: FileProcessor dosyasını dahil edin. Bir girdi alacaksınız: bir dosya adı.

    Bir FileProcessor oluşturun ve aşağıdakileri gerçekleştirmek için bir try-catch-finally yapısı 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 ve açıksa close() 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"

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi