Kendi Makalelerimi ve Arşivimdekileri Bu Başlık Altında Yazıyorum.
PHP5 Exceptions-İstisnalar -Bilgi
PHP 5 ile birlikte hataları kontrol etmek için nesneye yönelik bir yaklaşım ortaya çıktı.
Hata ayıklama durumları hata oluştuğu anda işletilecek kodun normal akışını değiştirerek yönetilmesini sağlamaktadır.Buna ististan yönetimi adı verilir.
İstisna tetiklendiği anda şu aşamalar gerçekleşir;
Varolan kod durumu kaydedilir.
Kod işletimi önceden tanımladan hata ayıklama bloğuna atlayacaktır.
Duruma göre , hata ayıklama sonunda , ya en son işletilen kod bloğuna yeniden dönerek devam edecek, yada hata ayıklama bloğunda belirtilen aşamadan devam edecektir.
Şimdi farklı hata ayıklama yöntemlerini inceleyelim:
Basit istisna kullanımı
Özel istisna ayıklayıcı tasarlamak
Çoklu istisnalar
Tekrarlı istisna göndermek
Yüksek seviye istisna ayıklayıcı ayarlamak
Note: İstisnalar yanlızca hatalı oluşması durumunda kullanılmalıdır.Ayrıca kodun herhangi bir noktasına atlaması için kullanılmamalıdır.
--------------------------------------------------------------------------------
Basit Exception(İstisna)
Bir istisna fırlatıldığında , devamındaki kod çalışmaya devam etmez, PHP gönderilen parçada catch ifadesi arar. catch ifadesi throw edilen istisnayı yakalar..
Eğer istisna hedefte yakalanamazsa , fatal error(ölümcül hata) oluşur.Hata notu Uncaught Exception - Yakalanamayan istisna olarak görülür.
Şimdi yakalanmayan bir istisna tasarlayalım;
<?php
//istisna fonksiyonu tanımlayalım
function checkNum($number)
{
if($number>1)
{
throw new Exception( Değer 1 veya birden az olmalı );
}
return true;
}
//istisnayı tetikle
checkNum(2);
?>
The code above will get an error like this:
Fatal error: Uncaught exception ’Exception’
with message ’ Değer 1 veya birden az olmalı ’ in C:\\webfolder\\test.php:6
Stack trace: #0 C:\\webfolder\\test.php(12):
checkNum(28) #1 {main} thrown in C:\\webfolder\\test.php on line 6
Throw ve catch İfadeleri
Yukarıdaki gibi hatalarla uğraşmamak için ,uygun bir istisna yönetimi tasarlamamız gerekir.
Uygun bir istisna aşağıdaki ifadeleri içerir:
1. Try - istisna tanımlanan fonksiyon try bloğunda bulunur.İstisna gönderilmezse,kod çalışmaya devam etmez.İstisna tetiklenirse , try bloğundan fırlatılır ve adrese yönelir.
2. Throw -İstisnanın tetiklediği bloktur.Her throw ifadesi en az bir catch ifadesine sahip olmalıdır.
3. Catch - catch bloğu istisnanın yakalandığı ve tetiklendiği şekilde çalıştırıldığı bloktur.
Bir İstisna yi geçerli bir kod ile tetikleyelim:
<?php
//istisna fonksiyonu oluşturalım
function checkNum($number)
{
if($number>1)
{
throw new Exception( Değer 1 veya daha az olmalıdır. );
}
return true;
}
// try bloğunda istisnayı tetikleyelim
try
{
checkNum(2);
//istisna fırlatıldığında,bu kod çalışmayacaktır.
echo ’Bunu görüyorsanız,değer 1 den kucuk demektir’;
}
//İstisna yakala
catch(Exception $e)
{
echo ’Message: ’ .$e->getMessage();
}
?>
Kod aşağıdaki gibi bir hata mesajı yayınlayacaktır:
Message: Değer 1 veya daha az olmalıdır
Example explained:
Yukardaki kod, istisya fırlatır ve yakalar;
1. checkNum() fonksiyonu yaratıldı. Fonksiyon değerin 1 den büyük yada küçük olduğunu denetler.Ve istisna fırlatılır.
2. checkNum() fonksiyonu try bloğunda çağırıldı.
3. checkNum() daki istisna fırlatıldı
4. catch bloğu istisnayı ele alır ve istisna bilgilerini içeren $e nesnesini yaratır.
5. İstisna nesnesi tarafından getMessage() fonksiyonu ile hata mesajı yayınlanır.
--------------------------------------------------------------------------------
Custom Exception(İstisna) Sınıfları Oluşturmak
Özel istisna sınıfları oluşturmak son derece basittir. PHP de oluşacak hataları yönetmek için fonksiyonlar içeren sınıf oluşturuyoruz.
Özel istista sınıfımız PHP istisna yönetim sınıfından kalıtılır,ve tüm özelliklerini kullanabilir.Ayrıca kendimize göre de fonksiyon ekleyebiliriz.
İstisna sınıfı oluşturalım:
<?php
class customException extends Exception
{
public function errorMessage()
{
//Hata mesajı
$errorMsg = ’Error on line ’.$this->getLine().’ in ’.$this->getFile()
.’: <b>’.$this->getMessage().’</b>geçersiz e-mail adresi’;
return $errorMsg;
}
}
$email = trexianos@gmail.com ;
try
{
//denetle
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//email adresi geçersiz ise istisna fırlat
throw new customException($email);
}
}
catch (customException $e)
{
//özel mesajı yayınla
echo $e->errorMessage();
}
?>
Örneğimizi Açıklayalım;
Yukardaki kod örneğimiz özel bir istisna sınıfı ile , istista fırlatır ve yakalar.
1. customException() sınıfı PHP öntanımlı Exception sınıfından kalıtılmış bir istisna sınıfıdır.
2. errorMessage() function oluşturulur.e-mail adresi yanlış ise bir hata mesajı döndürür.
3. $email string yapısında tanımlanan geçerli bir email adresini tutar.
4. try blogu çalıştırılı ve e-mail adresi geçersiz ise istisna gönderilir.
5. catch bloğu istista yöntemini yakalar ve hata mesajını yayınlar.
--------------------------------------------------------------------------------
Çoklu İstisnalar
Birden fazla istisnaları yönetmek ve uygulamak PHP script I için mümkündür.
Birkaç if..else bloğu ve switch kullanarak çoklu istisnaları uygulayabiliriz.Bu istisnalar, farklı istisna sınıflarını kullanabilir ve farklı hata mesajları yayınlayabilirler:
<?php
class customException extends Exception
{
public function errorMessage()
{
//hata mesajı
$errorMsg = ’Error on line ’.$this->getLine().’ in ’.$this->getFile()
.’: <b>’.$this->getMessage().’</b> geçersiz e-mail adresi’;
return $errorMsg;
}
}
$email = trexianos@gmail.com ;
try
{
//denetle
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// email adresi yanlış ise istisna gönder
throw new customException($email);
}
// trexianosu mail adresinde arar
if(strpos($email, örnek ) !== FALSE)
{
throw new Exception( $email örnek bir mail adresidir );
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
Örneği Açıklayalım:
Yukardaki kod iki durumda ve iki istisna fırlatma işlemini yorumlar ve denetler;
1. customException() sınıfı PHP Exception sınıfndan kalıtılır.Kalıtılan Exception sınıfın bütün methodlarını ve özelliklerini kullanabilir.(Class Konusunda daha detaylı işleyeceğiz)
2. errorMessage() oluşturuldu .Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar.
3. $email değişkeni String tabanlıdır ve trexianos stringini tutar.
4. try bloğu çalıştırılır ve ilk durumda istisna fırlatılmaz.
5. İkinci koşulda trexianos Stringini gördüğü anda istisnayı tetikler.
6. catch bloğu istisnayı yakalar ve hata mesajını doğrular.
customException yakalanmaz ise , sadece basit istisna yakalanır ve catch bloğunda tutulur.
--------------------------------------------------------------------------------
Exceptions(İstisna) nın Tekrar Fırlatılması
Bazı durumlarda , bir istisna fırlatıldığında ,normal olan yoldan farklı bir şekilde istisnayı tutmanı gerekebilir. Böyle durumlarda bir catch bloğuyla ikinci tekrarda istisna fırlatabilirsiniz .
Script sistem hatalarını kullanıcıdan saklayabilir.Bu hatalar kullanıcıyı ilgilendirmez ama programcı için çok önemlidir.Bu durumu kolaylaştırmak için bir kullanıcıya tekrar istisna fırlatarak samimi bir mesajla kullanıcıya gösterebilirsiniz:
<?php
class customException extends Exception
{
public function errorMessage()
{
//hata mesajı
$errorMsg = $this->getMessage().’ is not a valid E-Mail address.’;
return $errorMsg;
}
}
$email = trexianos@gmail.com ;
try
{
try
{
// trexianosu mail adresinde denetle
if(strpos($email, example ) !== FALSE)
{
//mail geçersiz ise istisna fırlat
throw new Exception($email);
}
}
catch(Exception $e)
{
//tekrar fırlat
throw new customException($email);
}
}
catch (customException $e)
{
//özel mesajı yayınla
echo $e->errorMessage();
}
?>
Örneği Açıklayalım:
Yukardaki kod email adresinin trexianos stringini içerip içermediğini denetler ,içeriyor ise istisna tekrar gönderilir:
1. customException() sınıfı PHP Exception sınıfndan kalıtılır.Kalıtılan Exception sınıfın bütün methodlarını ve özelliklerini kullanabilir
2. errorMessage() oluşturuldu .Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar.
3. $email değişkeni String tabanlıdır ve trexianos stringini tutar.
4. try bloğu içindeki birbaşka try bloğu koşulu denetler ve tekrar istisna gönderir
5. E-mail içeriğinde trexianos stringi bulunduğunda istisna tetiklenir
6. catch bloğuistisnayı yakalar ve tekrar bir customException gönderir
7. customException yakalanır ve hata mesajı yayınlar
İstisna yakalanamazsa , try bloğunun dışına çıkar ve üst blokta aramaya başlar.
--------------------------------------------------------------------------------
Üst Seviye İstisna Yakalayıcı Tasarlamak
set_error_handler() fonksiyonu ile kullanıcı tanımlı fonksiyonları kullanarak yakalanamayan istisnaları yakalar.
<?php
function myException($exception)
{
echo <b>Exception:</b> , $exception->getMessage();
}
set_exception_handler(’myException’);
throw new Exception(’Yakalanamayan İstisna oluştu);
?>
Yukarıdaki kodun çıktısı şu şekilde görülür:
Exception: Yakalanamayan İstisna oluştu