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 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 zero

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

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

challenge icon

Görev

Kolay

Hataları 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.phpException sınıfını genişleten özel bir FileException sınıfı oluşturun. Bu, sisteminizdeki dosya ile ilgili hataları temsil edecektir.
  • 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:
    • false olarak başlatılmış özel (private) bir boolean özellik: $isOpen
    • $isOpen değerini true yapan ve "Opening: [filename]" yazdıran bir open(string $filename): void metodu. Eğer dosya adı "invalid.txt" ise, "Cannot open file" mesajıyla bir FileException fırlatın
    • "Processing file..." yazdıran bir process(): void metodu. Eğer $isOpen değeri false ise, "File not open" mesajıyla bir RuntimeException fırlatın
    • $isOpen değerini false yapan ve "File closed" yazdıran bir close(): void 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 şunları yapmak 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 hatasını yakalayın ve "File error: [message]" yazdırın
    • RuntimeException hatasını yakalayın ve "Runtime error: [message]" yazdırın
    • finally bloğunda: isOpen() kullanarak dosyanın açık olup olmadığını kontrol edin ve eğer açıksa close() 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.

Kopya kağıdı

İstisnaları düzgün bir şekilde yönetmek ve temizleme kodunun her zaman çalışmasını sağlamak için try-catch-finally yapısını kullanın:

<?php
try {
    // istisna fırlatabilecek kod
} catch (ExceptionType $e) {
    // istisnayı yönet
    echo $e->getMessage();
}

Ayrı catch blokları ile birden fazla istisna türünü yakalayın. 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 yürütülür, bu da onu temizleme işlemleri için ideal hale getirir:

<?php
try {
    // işlemi dene
} catch (Exception $e) {
    // hatayı yönet
} finally {
    // temizleme kodu her zaman çalışır
}

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

?>
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