PHP programlama dilinde uygulama geliştirirken çeşitli hatalarla karşılaşabiliriz. Örneğin bir dosyanın bulunamaması, hatalı veri girilmesi, geçersiz bir işlem yapılması veya bir fonksiyona uygun olmayan değer gönderilmesi uygulamanın beklediğimiz şekilde çalışmasını engelleyebilir.
Bu tür durumlarda hataları kontrol etmek ve kullanıcıya anlaşılır mesajlar göstermek önemlidir.
PHP, hataları yönetebilmemiz için try, catch, throw, Exception ve finally gibi yapılar sunar.
Hata yönetimi, bir program çalışırken oluşabilecek sorunların belirlenmesi, uygun şekilde ele alınması ve gerektiğinde kullanıcıya bilgi verilmesi işlemidir.
Örneğin bir öğrencinin sınav notunu hesaplayan uygulamada not değerinin 0 ile 100 arasında olması gerektiğini düşünelim.
Kullanıcı 150 değerini girerse programın bu değeri doğrudan kabul etmesi yerine hatalı giriş yapıldığını bildirmesi gerekir.
PHP'de bu tür durumları kontrol ederek kendi istisnalarımızı oluşturabiliriz.
Hata yönetiminin temel amaçları şunlardır:
PHP'de farklı nedenlerle çeşitli hata ve uyarılar oluşabilir.
| Hata Türü | Açıklama |
|---|---|
| Parse Error | PHP kodunun yazım kurallarına uygun olmaması durumunda oluşur. |
| Warning | Bir işlem sırasında sorun oluştuğunu bildirir. Çoğu durumda program çalışmaya devam edebilir. |
| Notice / Warning | Tanımlanmamış değişken veya dizi anahtarı gibi durumlarda PHP sürümüne bağlı olarak oluşabilen bildirimlerdir. |
| TypeError | Bir fonksiyona veya işleme uygun olmayan veri türü gönderildiğinde oluşabilir. |
| DivisionByZeroError | Sıfıra bölme gibi geçersiz matematiksel işlemlerde oluşabilir. |
| Exception | Uygulamanın kendisi veya kullandığı bir kütüphane tarafından oluşturulabilen istisnadır. |
Önemli: PHP'deki bütün uyarılar ve yazım hataları try-catch ile yakalanmaz. try-catch yapısı, fırlatılan Exception ve Error türündeki nesneleri yakalamak için kullanılır.
Exception, programın normal çalışma akışını etkileyen ve özel olarak ele alınabilen bir durumu temsil eden istisna nesnesidir.
Örneğin kullanıcıdan alınan bir yaş değerinin negatif olması, uygulamanın kurallarına aykırı olabilir.
Böyle bir durumda Exception oluşturarak işlemin geçersiz olduğunu bildirebiliriz.
PHP'de Exception nesnesi aşağıdaki şekilde oluşturulabilir:
<?php
$hata = new Exception("Geçersiz işlem!");
?>
Burada new ifadesi yeni bir nesne oluşturur. Exception ise PHP'nin hazır istisna sınıflarından biridir.
Ancak yalnızca Exception nesnesi oluşturmak, istisnayı fırlatmak anlamına gelmez. Bunun için throw ifadesi kullanılır.
try bloğu, istisna oluşturabilecek kodların çalıştırıldığı bölümdür.
catch bloğu ise uygun türde bir istisna oluştuğunda bu istisnanın yakalanmasını ve gerekli işlemlerin yapılmasını sağlar.
Genel kullanım şekli aşağıdaki gibidir:
<?php
try {
// Çalıştırılacak kodlar
} catch (Exception $hata) {
// İstisna oluştuğunda çalışacak kodlar
}
?>
<?php
try {
$yas = -5;
if ($yas < 0) {
throw new Exception("Yaş negatif olamaz.");
}
echo "Yaş: " . $yas;
} catch (Exception $hata) {
echo "Hata: " . $hata->getMessage();
}
?>
Ekran Çıktısı:
Hata: Yaş negatif olamaz.
Bu örnekte yaş değişkeninin değeri negatif olduğu için throw ile bir Exception fırlatılmıştır.
Oluşturulan istisna catch bloğu tarafından yakalanmış ve hata mesajı ekrana yazdırılmıştır.
throw ifadesi, program içerisinde bir istisna fırlatmak için kullanılır.
Genellikle if-else gibi koşul yapılarıyla birlikte kullanılır.
Örneğin öğrencinin sınav notunun 0 ile 100 arasında olması gerektiğini kontrol edelim.
<?php
try {
$not = 120;
if ($not < 0 || $not > 100) {
throw new Exception(
"Sınav notu 0 ile 100 arasında olmalıdır."
);
}
echo "Sınav Notu: " . $not;
} catch (Exception $hata) {
echo $hata->getMessage();
}
?>
Ekran Çıktısı:
Sınav notu 0 ile 100 arasında olmalıdır.
Burada sınav notu geçerli aralıkta olmadığı için hata mesajı oluşturulmuştur.
getMessage(), yakalanan istisnanın mesajını öğrenmek için kullanılan bir metottur.
Metot, bir nesneye ait fonksiyon anlamına gelir. PHP'de nesne metotlarına erişmek için -> operatörü kullanılır.
<?php
try {
throw new Exception("Bir hata oluştu!");
} catch (Exception $hata) {
echo $hata->getMessage();
}
?>
Ekran Çıktısı:
Bir hata oluştu!
Burada $hata değişkeni yakalanan Exception nesnesini temsil eder.
finally bloğu, try-catch yapısında istisna oluşup oluşmamasından bağımsız olarak çalıştırılması amaçlanan kodları içerir.
Özellikle işlem sonrasında yapılması gereken temizleme veya bilgilendirme işlemlerinde kullanılabilir.
<?php
try {
$sayi = 10;
if ($sayi < 0) {
throw new Exception("Negatif sayı!");
}
echo "Sayı: " . $sayi . "<br>";
} catch (Exception $hata) {
echo $hata->getMessage() . "<br>";
} finally {
echo "İşlem tamamlandı.";
}
?>
Ekran Çıktısı:
Sayı: 10
İşlem tamamlandı.
Bu örnekte istisna oluşmadığı için catch bloğu çalışmamıştır. Ancak finally bloğu çalıştırılmıştır.
Not: finally bloğu normal istisna akışında çalışır. Ancak işlemin dışarıdan zorla sonlandırılması gibi durumlarda çalışması garanti değildir.
PHP'de farklı türdeki hatalar için birden fazla catch bloğu oluşturulabilir.
Örneğin sıfıra bölme hatası ile kendi oluşturduğumuz Exception türündeki istisnaları ayrı ayrı ele alabiliriz.
<?php
try {
$sayi1 = 20;
$sayi2 = 0;
$sonuc = $sayi1 / $sayi2;
echo $sonuc;
} catch (DivisionByZeroError $hata) {
echo "Bir sayı sıfıra bölünemez.";
} catch (Exception $hata) {
echo "İşlem sırasında bir hata oluştu.";
}
?>
Ekran Çıktısı:
Bir sayı sıfıra bölünemez.
Bu örnekte sıfıra bölme işlemi DivisionByZeroError türünde bir hata oluşturur ve ilgili catch bloğu çalışır.
PHP'de istisna ve hata nesnelerinin ortak temel arayüzü Throwable olarak adlandırılır.
Exception ve Error türleri Throwable arayüzünü uygular.
Bu nedenle hem Exception hem de Error türündeki fırlatılmış nesneleri yakalamak için catch (Throwable $hata) kullanılabilir.
<?php
try {
$sayi1 = 15;
$sayi2 = 0;
echo $sayi1 / $sayi2;
} catch (Throwable $hata) {
echo "İşlem sırasında hata oluştu.";
}
?>
Throwable, farklı hata türlerini tek bir catch bloğunda ele almak gerektiğinde kullanılabilir.
Ancak her hatayı yakalayıp görmezden gelmek doğru değildir. Uygulamanın beklenmeyen hataları kayıt altına alınmalı ve uygun şekilde yönetilmelidir.
PHP'de yakalanan bir Exception veya Error nesnesinden farklı bilgiler alınabilir.
| Metot | Açıklama |
|---|---|
| getMessage() | Hata mesajını verir. |
| getCode() | Hata kodunu verir. |
| getFile() | Hatanın oluştuğu dosyanın yolunu verir. |
| getLine() | Hatanın oluştuğu satır numarasını verir. |
| getTraceAsString() | Hatanın çağrı geçmişini metin olarak verir. |
<?php
try {
throw new Exception("Örnek hata", 1001);
} catch (Exception $hata) {
echo "Mesaj: " . $hata->getMessage() . "<br>";
echo "Kod: " . $hata->getCode() . "<br>";
echo "Satır: " . $hata->getLine();
}
?>
Bu örnekte hata mesajı, hata kodu ve hatanın oluşturulduğu satır numarası görüntülenir.
Dikkat: Gerçek web sitelerinde dosya yolları ve ayrıntılı hata bilgileri ziyaretçilere gösterilmemelidir. Bu bilgiler geliştiricilerin inceleyebileceği güvenli günlük kayıtlarında tutulmalıdır.
PHP'de hata raporlama davranışını kontrol etmek için error_reporting() ve ini_set() kullanılabilir.
Örneğin geliştirme ortamında hataları görüntülemek için aşağıdaki ayarlar kullanılabilir.
<?php
error_reporting(E_ALL);
ini_set("display_errors", "1");
?>
error_reporting(E_ALL), PHP'nin raporlayabildiği bütün hata seviyelerinin etkinleştirilmesini sağlar.
display_errors ayarı ise hata mesajlarının ekranda gösterilip gösterilmeyeceğini belirler.
Gerçek kullanıcıların eriştiği üretim ortamlarında ayrıntılı hata mesajlarının ekranda gösterilmesi güvenlik açısından sakıncalı olabilir.
Bu nedenle üretim ortamlarında hata gösterimi genellikle kapatılır ve hatalar sunucunun günlük kayıtlarına yönlendirilir.
Şimdi öğrendiğimiz hata yönetimi yapılarını kullanarak beş farklı uygulama geliştirelim.
Bu uygulamada öğrencinin sınav notunun 0 ile 100 arasında olup olmadığını kontrol edeceğiz.
<?php
try {
$not = 110;
if ($not < 0 || $not > 100) {
throw new Exception("Geçersiz sınav notu!");
}
if ($not >= 50) {
echo "Öğrenci başarılı.";
} else {
echo "Öğrenci başarısız.";
}
} catch (Exception $hata) {
echo $hata->getMessage();
}
?>
Ekran Çıktısı:
Geçersiz sınav notu!
Bu uygulamada iki sayının bölme işlemini gerçekleştireceğiz. İkinci sayı sıfır olduğunda kullanıcıya hata mesajı göstereceğiz.
<?php
try {
$sayi1 = 50;
$sayi2 = 0;
if ($sayi2 == 0) {
throw new Exception(
"Bölen sayı sıfır olamaz."
);
}
$sonuc = $sayi1 / $sayi2;
echo "Sonuç: " . $sonuc;
} catch (Exception $hata) {
echo "Hata: " . $hata->getMessage();
}
?>
Ekran Çıktısı:
Hata: Bölen sayı sıfır olamaz.
Bu uygulamada kullanıcının yaşının belirli bir aralıkta olup olmadığını kontrol edeceğiz.
<?php
try {
$yas = 150;
if ($yas < 0 || $yas > 120) {
throw new Exception(
"Lütfen geçerli bir yaş giriniz."
);
}
if ($yas >= 18) {
echo "Kullanıcı reşittir.";
} else {
echo "Kullanıcı reşit değildir.";
}
} catch (Exception $hata) {
echo $hata->getMessage();
}
?>
Bu uygulamada yaş değeri belirlenen aralığın dışında olduğunda istisna oluşturulur.
Bu uygulamada bir metin dosyasının mevcut olup olmadığını kontrol edeceğiz. Dosya bulunamazsa Exception oluşturacağız.
<?php
try {
$dosya = __DIR__ . "/bilgiler.txt";
if (!is_file($dosya)) {
throw new Exception("Dosya bulunamadı.");
}
$icerik = file_get_contents($dosya);
if ($icerik === false) {
throw new Exception("Dosya okunamadı.");
}
echo nl2br(
htmlspecialchars($icerik, ENT_QUOTES, "UTF-8")
);
} catch (Exception $hata) {
echo "Hata: " . $hata->getMessage();
}
?>
Bu örnekte dosyanın mevcut olup olmadığı kontrol edilmiştir. Dosya bulunamadığında veya okunamadığında özel hata mesajı oluşturulmuştur.
Not: file_get_contents() gibi bazı dosya fonksiyonları başarısız olduğunda PHP uyarısı da oluşturabilir. Bu uyarılar normal şartlarda catch bloğu tarafından doğrudan yakalanmaz. Örnekte fonksiyonun döndürdüğü false değeri kontrol edilerek Exception oluşturulmuştur.
Bu uygulamada HTML formundan alınan öğrencinin adı ve sınav notunu kontrol edeceğiz.
Öğrenci adı boş bırakılırsa veya sınav notu geçersizse kullanıcıya hata mesajı gösterilecek.
Dosyamızın adı not_kontrol.php olsun.
<?php
$mesaj = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
try {
$ad = trim($_POST["ad"] ?? "");
$not = $_POST["not"] ?? "";
if ($ad === "") {
throw new Exception(
"Öğrenci adı boş bırakılamaz."
);
}
if ($not === "" || !is_numeric($not)) {
throw new Exception(
"Lütfen sayısal bir not giriniz."
);
}
$not = (float) $not;
if (!is_finite($not) || $not < 0 || $not > 100) {
throw new Exception(
"Not 0 ile 100 arasında olmalıdır."
);
}
$mesaj = $ad . " - Not: " . $not;
if ($not >= 50) {
$mesaj .= " - Başarılı";
} else {
$mesaj .= " - Başarısız";
}
} catch (Exception $hata) {
$mesaj = "Hata: " . $hata->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Not Kontrol Uygulaması</title>
</head>
<body>
<h3>Öğrenci Not Kontrolü</h3>
<form method="post">
<label>Öğrenci Adı:</label>
<input type="text" name="ad" required>
<br><br>
<label>Sınav Notu:</label>
<input type="number" name="not"
min="0" max="100" step="any" required>
<br><br>
<button type="submit">Kontrol Et</button>
</form>
<p>
<?php
echo htmlspecialchars(
$mesaj,
ENT_QUOTES,
"UTF-8"
);
?>
</p>
</body>
</html>
Bu uygulamada kullanıcı tarafından gönderilen veriler PHP tarafında kontrol edilmiştir.
Hatalı veri girildiğinde throw ile Exception oluşturulmuş, catch bloğunda hata mesajı alınarak kullanıcıya gösterilmiştir.
HTML formunda kullanılan required, min ve max gibi özellikler kullanıcıya yardımcı olur. Ancak güvenlik ve veri doğruluğu için kontrollerin PHP tarafında da yapılması gerekir.
Uygulama 1: Bir sayının negatif olup olmadığını kontrol eden, negatifse Exception oluşturan PHP uygulaması hazırlayınız.
Uygulama 2: İki sayının bölme işlemini gerçekleştiren ve bölen sayı sıfır olduğunda hata mesajı gösteren uygulama geliştiriniz.
Uygulama 3: Bir öğrencinin sınav notunu kontrol eden, not 0 ile 100 arasında değilse Exception oluşturan uygulama hazırlayınız.
Uygulama 4: Belirtilen dosyanın mevcut olup olmadığını kontrol eden, dosya bulunamazsa hata mesajı gösteren uygulama geliştiriniz.
Uygulama 5: HTML formundan alınan kullanıcı adı ve yaş bilgilerini kontrol eden, geçersiz verilerde try-catch ile hata mesajı gösteren PHP uygulaması hazırlayınız.
Bu dersimizde PHP programlama dilinde hata yönetiminin nasıl gerçekleştirildiğini öğrendik.
try ve catch bloklarıyla istisnaları yakaladık, throw ifadesiyle kendi istisnalarımızı oluşturduk ve Exception sınıfıyla hata mesajlarını yönettik.
Ayrıca finally bloğunun kullanımını, farklı hata türlerinin yakalanmasını ve Throwable arayüzünün ne işe yaradığını inceledik.
Örnek uygulamalarımızda sınav notu kontrolü, bölme işlemi, yaş doğrulama, dosya okuma ve HTML form verilerinin kontrol edilmesi gibi işlemleri gerçekleştirdik.
Hata yönetimi, güvenilir ve sürdürülebilir PHP uygulamaları geliştirmek için önemli bir konudur. Özellikle dosya işlemleri, kullanıcı verilerinin doğrulanması ve veritabanı işlemleri sırasında hata yönetimi yapılarından yararlanılır.
Öğrendiğiniz yapıları farklı uygulamalarda kullanarak PHP'de oluşabilecek sorunları daha kontrollü biçimde yönetebilirsiniz.
Toplam 50 Makale
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.