Karar Kontrol Mekanizması

Php 5 ile gelen yeniliklerin başında hata kontrol mekanizmasında yapılan yenilik gelmektedir. Php 4'te tüm olasılıklar mantıksal denetlemelerle yapılırken php 5'te ise tıpkı java'da olduğu gibi "try" yapısı kullanılarak, bir nevi java'yla entegrasyona gidilmekte olduğu görülüyor. Her ne kadar anlaşılması çok kolay bir yöntem olsa da, bu yöntem biraz amatör olarak değerlendirilebilir. İşte bu mantıktan yola çıkan php geliştiriciler grubu, php dilini nesne tabanlı bir dile çevirmek için çaba sarf ettiler. Aldığımız duyumlara göre java’nın web teknolojisinde tıpkı microsoft’un asp’sinde olduğu gibi jsp’de de artık farklı diller kullanabileceğiz. En azından bunun üzerinde çalışan firmalar işin sonunu getirebilirlerse java’nın altyapısından yararlanarak jsp içerisinde php, perl, python gibi dilleri kullanabileceğiz

Karar Kontrol Mekanizması

try{
        //Karar kontrolü
}
catch ( Hata olgusu ){
        //Hata olduğu takdirde yapılacak işlem
}

 
Basit olarak PHP 5 ile gelen hata kontrol mekanizması yukarıdaki gibidir. Bu mekanizma her ne kadar Java programlama diline benzese de, Java ile aynıdır demek Java programlama diline büyük haksızlık olur. Zira Java’nın içerisinde gelen büyük Java kütüphanesi PHP ile birlikte gelmiyor. Onun için PHP 5 ile Java’yı kıyaslamak büyük bir yanılgı olur.


Yukarıda verdiğimiz karar kontrol mekanizmasında, işlemin nerede yapılacağı ve işlem hatalı çıkması durumunda nelerin yapılacağını belirten “catch” mekanizmasının çalışma mantığını kavramanız için basit bir örnek vererek konumuzu somutlaştıralım.
   

 

 

<?php

$sayi = 10.1;

try
{
    if (! is_int($sayi) )

     throw new Exception("Sayı Değil");
}

catch (Exception $e)
{
die("{$e->getMessage()}");
}

echo "$sayi değişkeni sayıdır";

?>
 

 
Yukarıdaki kodu incelersek, burada oluşturduğumuz değişkene bir değer atayıp, bu değerin sayı değeri olup olmadığını bir mantıksal denetleme ile kontrol ediyoruz. Mantıksal denetlemede sayı değeri olmaması durumunda işlem yapmak için (!) ünlem işareti koyuyoruz. Belirtilen işlemin true yani doğru olarak dönmesi durumunda verilecek hata raporunu belirlemek için de “throw new Exception” kalıbını kullanıyoruz. Hata işlemi yapıldığında oluşacak pozisyonu belirlemek için catch bölümünde Exception kalıbını kullanarak, oluşan hatayı bu kalıbın önünde oluşturacağımız değişkene atıyoruz. Süslü parantezler içinde de oluşan bu hatanın ne olduğunu yazdırıyoruz. Tanımladığımız $sayi değişkenine tam sayı değeri vermediğimiz için, mantıksal denetleme doğal olarak Exception, yani oluşabilecek hata durumunda yapılacak işlemler bölümünde tanımladığımız hata metnini "{$e->getMessage()}" deyimi ile ekrana yazdırıyor..

Yukarıda gördüğünüz gibi uygulamanızdaki kodları try blogu içine yazarak istisna yöntemini kullanmaya başlayabilirsiniz. Bu blok arasına yazdığız kodlarda bir hata meydana gelirse, istisna fırlatma denilen işlemin uygulanmasını başlatılır.

İstisna Fırlatalım
throw new Wxception(‘Mesaj’,code);

throw anahtar sözcüğü ile istisna yönetimi mekanizmasını tetikleyebilirsiniz. Bu anahtar sözcük bir nesne almayı bekler.En basit durumda Php5 teki yerleşik Exception sınıfının bir örneğini oluşturabilirsiniz.

Bu sınıfa ait yapılandırıcı iki parametre alır, Bir mesaj ve bir kod.Bunlar bir hata mesajını ve bir hata kod numarasını temsil eder.

Try bloğunun altında bir tanede catch bloğu vardır. Buda fırlatılan istisnaların yakalanmasını sağlar.
 

Hata Kodu

Açıklaması

getMessage()

Exception bölümünde tanımlanan hata mesajını verir

getCode()

Hata kodu

getFile()

Hatanın oluştuğu dosyanın diziniyle birlikte adı

getLine()

Hata numarası

toString()

Tüm hata kodlaması


Burada verdiğimiz karar kontrol mekanizmasını çalıştırırsak karşımıza “Sayı Değil” cümlesi gelecektir. Peki bu karar kontrol mekanizmasının sonunda yazdığımız echo satırına ne oldu? Deneyimli programcılar anlayacaktır; PHP herhangi bir hatayla karşılaştığı durumda dosyanın okunmasını durdurarak, alt kısmı göz ardı etmekte. Bir nevi exit kullanmış gibi PHP okumayı kesmekte. Bu özelik if mantıksal denetlemesinde yoktu. Yukarıdaki örneği biraz değiştirelim:
 

$sayi = 10.1;

if (!is_int($sayi)) {
echo "Bu bir sayıdır";
}
else {
echo "Bu bir sayı değildir";
}
echo "Bağımsız metin";


Yukarıdaki komut yapısını çalıştırdığımızda her halükarda mantıksal denetlemenin sonundaki echo komutu çalışacaktır. Bu ayrımı göz önüne alarak programlarınızı oluşturmanızda yarar var.


PHP 5 ile gelen karar kontrol mekanizmasını daha kararlı kullanmak için bir fonksiyon oluşturup, bu fonksiyonda hata düzeneğini bir kerede tanımlayıp, istediğimizde bu fonksiyonu çağırarak işlemlerimizde kullanabiliriz.
 

<?php

function hata($e)
{
         return "Dosya adı : {$e->getFile()} <br>
        Hata numarası : {$e->getLine()} <br>
        Hata mesajı : {$e->getMessage()} <br>
        Hata kodu : {$e->getCode()}"
;
}

$sayi = 10.1;

try
{
        if (! is_int($sayi) )
        throw new Exception("Sayı Değil");
}

catch (Exception $e)
{
        die(hata($e));
}

?>

 
Yukarıda tek yaptığımız muhtemel hataların neler olacağını belirlemek için tanımladığımız fonksiyon içerisine yerleştirmekten ibaret. Fonksiyonu çağırmak için, catch özelliğinin süslü parantezleri içerisine yerleştirip, Exception alanında tanımladığımız hata içeriğini toplayan değişkeni de bu fonksiyonun parantezleri içerisine koyarak, hata özelliklerini fonksiyonun içerisine gönderiyoruz. Böylece oluşan hataları fonksiyonda tanımladığımız motoru devreye sokarak, oluşan hata argümanlarını listeleyerek oluşturduğumuz kodda nerede hata olduğunu kolayca tespit ediyoruz.


Görüldüğü gibi PHP 5 ile gelen karar kontrol mekanizması zannedildiği kadar zor bir işlem değil. Burada verdiğimiz bilgiler ışığında hata kontrol mekanizmasının işleyişinin mantığını kavradıysanız, ilerleyen sayfalarda PHP 5’i kavrama babında zorlanmayacaksınız. Zira PHP 5’i kavramanın ilk aşamasında karar kontrol mekanizması bulunmakta. Bu konuyu kavrayıp yeni nesne yönelimini de öğrenirseniz özellikle veritabanı işlemlerinde artık nesne yönelimlerini kullanarak kod geliştirerek profesyonelliğe bir adım atabilirsiniz.

  Basit exception örneği
 

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Sıfıra bölüm hatası.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "<br/>";
    echo inverse(0) . "<br/>";
} catch (Exception $e) {
    echo 'Yakalanan Taşma: ',  $e->getMessage(), "n";
}
?>

 
 

<?php
function SayiBolen($Sayi){

        $Bolunmus=$Sayi-2;

        if($Bolunmus<0){
                throw new Exception('Sayı sıfırdan küçük');
        }
        else {
                echo "$Bolunmus<br/>";
                SayiBolen($Bolunmus);
        }
}

try {
        SayiBolen(20);
}
catch (Exception $Problem){
        echo 'Hata Mesajınız '.$Problem->getMessage();
}
?>

 
  İç içe kullanılmış bir excepti

<?php
$Sayi=-2;
try {
        if($Sayi>0){
                try{
                        if($Sayi<10){
                                echo "Sayi 0 dan büyük 10 dan küçük";
                        }
                        else {
                                throw new Exception();
                        }
                }
                catch(Exception $Problem){
                        echo "Sayi 10 dan büyük";
                }
        }
        else {
                throw new Exception();
        }
}
catch(Exception $Problem){
        echo "Sayi sıfırdan küçük";
}
?>

 

Kaynak

Yorumunuzu Ekleyin

PHP Data Objects (PDO) Nedir?
Yükleniyor...