ana_sayfa / php / hata-y-netimi-ve-stisna
🐘 PHP 📊 İleri ⏱ 30 dk 📋 1 Kod Örneği

Hata Yönetimi ve İstisna

try-catch-finally, özel istisna sınıfları ve hata loglama.

PHP Exception Hiyerarşisi
<?php
// ── Özel Exception Sınıfları ──
class UygulamaHatasi extends RuntimeException {}
class DogrulamaHatasi extends UygulamaHatasi {
    private array $hatalar;
    public function __construct(array $hatalar) {
        parent::__construct("Doğrulama başarısız");
        $this->hatalar = $hatalar;
    }
    public function getHatalar(): array { return $this->hatalar; }
}
class VeriTabaniHatasi extends UygulamaHatasi {}
class YetkiHatasi extends UygulamaHatasi {}

// ── try-catch-finally ──
function kullanicikaydet(array $veri): array {
    try {
        // Doğrulama
        $hatalar = [];
        if (empty($veri['ad']))     $hatalar[] = "Ad zorunlu";
        if (empty($veri['email']))  $hatalar[] = "E-posta zorunlu";
        if (!filter_var($veri['email'] ?? '', FILTER_VALIDATE_EMAIL)) {
            $hatalar[] = "Geçersiz e-posta formatı";
        }
        if (strlen($veri['sifre'] ?? '') < 8) {
            $hatalar[] = "Şifre en az 8 karakter olmalı";
        }

        if (!empty($hatalar)) {
            throw new DogrulamaHatasi($hatalar);
        }

        // DB işlemi simülasyonu
        if ($veri['email'] === 'varolan@mail.com') {
            throw new VeriTabaniHatasi("Bu e-posta zaten kayıtlı", 409);
        }

        return ['basari' => true, 'mesaj' => 'Kayıt başarılı'];

    } catch (DogrulamaHatasi $e) {
        return ['basari' => false, 'hatalar' => $e->getHatalar()];

    } catch (VeriTabaniHatasi $e) {
        error_log($e->getMessage()); // Logla ama kullanıcıya gösterme
        return ['basari' => false, 'mesaj' => 'Kayıt sırasında hata oluştu'];

    } catch (Exception $e) {
        error_log("Beklenmeyen hata: " . $e->getMessage());
        return ['basari' => false, 'mesaj' => 'Bir hata oluştu, lütfen tekrar deneyin'];

    } finally {
        // Her durumda çalışır (başarı da hata da)
        echo "İşlem tamamlandı\n";
    }
}

// ── Hata İşleyici Kurma ──
set_error_handler(function($seviye, $mesaj, $dosya, $satir) {
    $log = sprintf("[%s] Hata: %s in %s:%d\n",
        date('Y-m-d H:i:s'), $mesaj, $dosya, $satir);
    error_log($log, 3, '/var/log/uygulama.log');

    if ($seviye === E_ERROR) {
        http_response_code(500);
        die("Bir hata oluştu");
    }
});

set_exception_handler(function(Throwable $e) {
    error_log("Yakalanmayan hata: " . $e->getMessage());
    http_response_code(500);
});

// ── Kullanım ──
$sonuc = kullanicikaydet([
    'ad'    => 'Furkan',
    'email' => 'gecersizemail',
    'sifre' => '123'
]);
print_r($sonuc);
?>
← Önceki Ders
PDO ile Veritabanı İşlemleri