try-catch-finally, özel istisna sınıfları ve hata loglama.
<?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);
?>