Tweet

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.

CODE:
<? 
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.
CODE:
/*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.
CODE:
<?
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.
CODE:
/*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.
CODE:
/*
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.
CODE:
<?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.
CODE:
<? 
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.


Dia
okanatabag@gmail.com
21 Subat 2007 14:36

İlgili Olabilecek Makaleler


Yorumlar (4)





by_derkan
30 Aralik 2008 18:46
çok teşekkürler basit ve anlaşılır anlatımınız için :)


Ongun23
31 Mart 2009 19:46
Makale için teşekkürler Php5 dizisi ile birlikte C#.Net coder'ları php'ye çok rahat bir şekilde adapte olabiliyor çünkü sintaks olarak neredeyse aynı =)


sky17
27 Ekim 2009 02:05
Merhaba
db class yazmak çabasındayım. Fakat kod içerisindeki
catch (Exception $e) kodunun bulunduğu
satırında

Parse error: syntax error, unexpected T_CATCH in C:AppServwwwOOPdenememysql_class.php on line 32
şeklinde bir hata alıyorum. Appserv kullanıoyrum ve yeni versiyon (5.2.6) ile güncelledim fakat çözüm olmadı. Fikrinizi alabilirmiyim.


curlyhair
17 Kasim 2009 11:21
gÜZLE OLmuş basit ve anlaşılır sizden bu tarz php geliştiriciler icin daha fazlasını bekliyoruz.Kolay gelsin

Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg