PHP 5 Exception (try-catch)
Bu yazıda Php 5 ile birlikte gelen en önemli özelliklerden biri olan Exception’lardan bahsedeceğim. Namı değer try-catch yapısı. Peki biz bu Exception lara neden gerek duyuyoruz öncelikle bu sorunun cevabını verelim. Yazılım geliştirmede yazılımı kodlamak kadar debug (hata ayıklama) da önemlidir. Çok büyük projelerde bir hata denetim mekanizması oluşturmadan ilerlersek, betiğimiz herhangi bir hata oluşturduğunda bu hatayı ayıklamak(bulmak ve onarmak) çok güç olacaktır. yüz binlerce satır kodun arasından hatanın nereden kaynaklandığını bulmak, büyük zaman ve iş gücü kaybına neden olabilir. İşte tam bu noktada Exception imdadımıza koşuyor. Aşağıda 2 adet kod bloğu var iki kodu da dilerseniz çalıştırıp çıktılarına bakabilirsiniz.
İlk kodumuz try-catch yapısı içerisinde yazıldı ve bu sayede hata denetimini kedi elimizde tutabiliyoruz.
<?
function bolme($bolen,$bolunen) {
if ($bolen==0) {
throw new Exception('Bir sayı sıfıra bölünemez');
}
else return "Sonuç: ".$bolunen/$bolen;
}
try {
echo bolme(5,20) . "<br>";
echo bolme(0,20) . "<br>";
echo bolme(5,100) . "<br>";
} catch (Exception $e) {
echo 'exception: ', $e->getMessage(), "<br>";
}
echo "merhaba";
?>
İlk kodumuz çalıştırdığımızda aşağıdaki gibi bir çıktı aldık.
/*Sonuç: 4 exception: Bir sayı sıfıra bölünemez merhaba */
Peki kodumuz ne yaptı bir bakalım. İlk olarak 20 sayısı 5 e bölündü ve sonucu 4 yazıldı. Tekrar bolme() metodu çağırıldı. Fakat $bolen değeri 0 olduğu için throw ile yeni bir exception fırlatıldı fırlatılan exception catch tarafından yakalanıp $e exception nesnesi yaratıldı $e nesnesi birçok metod içeriyor yazının ilerleyen bölümlerinde bunları da göreceğiz. Son olarak try { } içerisindeki kod bloğu durdurulup catch {} den sonraki satırdan betiğimiz çalışmaya devam etti ve merhaba kelmesini yazdırdı. Görüldüğü gibi hata oluştuğunda betiğimizin tamamı durmadı sadece try {} içerisindeki kod bloğu durdurulup betik kaldığı yerden devam etti.
İkinci kodumuz daha sıradan ve hata denetimi yapılmamış durumda.
<?
function bolme($bolen,$bolunen) {
return "Sonuç: ".$bolunen/$bolen;
}
echo bolme(5,20) . "<br>";
echo bolme(0,20) . "<br>";
echo "merhaba";
?>
İkinci kodumuzda try-catch kullanmadık ve ekranımızda bir warning mesajı aldık. Sıfıra bölme php yorumlayıcısı tarafından warning olarak bildiriliyor. Php yorumlayıcısı warning verdiğinde script betiği durmaz. Bu nedenle ekran çıktımız.
/*Sonuç: 4 Warning: Division by zero in C:wampwwwpublic_htmlphpi.php on line 3 Sonuç: merhaba */
şeklinde olacaktır. Sıfıra bölme işlemi warning değilde fatal error olarak karşımıza çıksaydı çıktımız.
/* fatal error: Division by zero in C:wampwwwpublic_htmlphpi.php on line 3 */
şeklinde olacaktı ve program betiğimiz durdurulacaktı. Belki php ile yazılan kodlarda OOP kullanılmadıysa bu durum pek fazla sorun olmaya bilir hatalı satıra gideriz ve durumu çözebiliriz. Fakat OOP Class yapısı ile yazılan scriptlerde hatayı hata satırını bulmamamız çok daha zor olacak tır. Bununla birlikte eğer geliştirmekte olduğunuz proje sürekli yaşamak zorunda ise örneğin bir e-ticaret portalı geliştiriyorsanız exception kullanmanız her zaman sizin yararınıza olacaktır. Mersela e-ticaret portalı geliştiriyorsunuz ve merkez bankasından döviz kurlarını çekip yazdırmanız gerekli ve bu kodu exception kullamadan yazdınız. İşleyen sisteme upload ettiniz. merkez bankasından veriler alınırken bir hata ile karşılaştınız. Ne oldu ekranda kocaman bir error yazısı siteye müşteriler erişemiyor. E-bay 30 saniye bu nedenle kapalı kalmış olsa 10.000 lerce dolar zarar ederdi herhalde.
Şimdi de Exception nesnesini biraz inceleyelim.
<?php
class Exception
{
protected $message = 'Unknown exception'; // exception mesajı
protected $code = 0; // tanılanabilir exception kodu
protected $file; // exception un fırlatıldığı dosya
protected $line; // exception un fırlatıldığı satır
function __construct($message = null, $code = 0);
final function getMessage(); // fırlatılan mesajı döndürür
final function getCode(); // fırlatılan exception kodunu döndürür
final function getFile(); // exception ın fırlatıldığı dosya ismini döndürür
final function getLine(); // exception ın fırlatıldığı satır numarasını döndürür
final function getTrace(); // exception fırlatılmasına neden olan metod ve dosya hakkında array olarak bilgi veri
final function getTraceAsString(); // getTrace() in yaptığı yapar fakat array yerine string kullanır.
/* Overrideable (düzenlenebilir.) */
function __toString(); // Hata mesajlarına yeni stiller katmak istenirse override(yeniden düzenleme) edilebilir.
}
?>
exception sınıfının yapısı bu şekilde. Örnek olması açısında Exception nesnesinin birkaç metodunu yukarıda yazdığımız kod da kullanalım.
<?
function bolme($bolen,$bolunen) {
if ($bolen==0) {
throw new Exception('Bir sayı sıfıra bölünemez');
}
else return "Sonuç: ".$bolunen/$bolen;
}
try {
echo bolme(5,20) . "<br>";
echo bolme(0,20) . "<br>";
} catch (Exception $e) {
echo 'exception: <b>Dosya:</b> '.$e->getFile().' <b>Hata Satırı:</b> '.$e->getLine().' <b>Hata:</b> '.$e->getMessage()."<br>";
echo "merhaba";
}
?>
Evet benden şimdilik bu kadar herkese iyi çalışmalar.
Okan ATABAĞ














Son Yorumlar