PHP - İstisna Yönetimi
İstisna yönetimi , özel bir hata oluştuğu zaman kodun akışını değiştirebilir
Exception(İstisna) Nedir?
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;
Kod:
<?php//istisna fonksiyonu tanımlayalımfunction checkNum($number){if($number>1){throw new Exception(”Değer 1 veya birden az olmalı”);}return true;}//istisnayı tetiklecheckNum(2);?>
Yukarıdaki kodu çalıştırırsak , aşağıdaki gibi bir hata ile karşılaşırız:
Kod:
Fatal error: Uncaught exception ‘Exception’with message ‘ Değer 1 veya birden az olmalı ‘ in C:\webfolder\test
php:6Stack 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:
- 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
- Throw -İstisnanın tetiklediği bloktur
Her throw ifadesi en az bir catch ifadesine sahip olmalıdır
- 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:
Kod:
<?php//istisna fonksiyonu oluşturalımfunction checkNum($number){if($number>1){throw new Exception(”Değer 1 veya daha az olmalıdır
”);}return true;}// “try” bloğunda istisnayı tetikleyelimtry{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 yakalacatch(Exception $e){echo ‘Message: ‘
$e->getMessage();}?>
Kod aşağıdaki gibi bir hata mesajı yayınlayacaktır:
Kod:
Message: Değer 1 veya daha az olmalıdır
Örnek Açıklaması:
Yukardaki kod, istisya fırlatır ve yakalar;
- checkNum() fonksiyonu yaratıldı
Fonksiyon değerin 1 den büyük yada küçük olduğunu denetler
Ve istisna fırlatılır
- checkNum() fonksiyonu try bloğunda çağırıldı

- checkNum() daki istisna fırlatıldı
- “catch” bloğu istisnayı ele alır ve istisna bilgilerini içeren $e nesnesini yaratır

- İ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:
Kod:
<?phpclass 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 = “birisi@kodadiweb
com”;try{//denetleif(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){//email adresi geçersiz ise istisna fırlatthrow new customException($email);}}catch (customException $e){//özel mesajı yayınlaecho $e->errorMessage();}?>
Örneğimizi Açıklayalım;
Yukardaki kod örneğimiz özel bir istisna sınıfı ile , istista fırlatır ve yakalar

- customException() sınıfı PHP öntanımlı “Exception” sınıfından kalıtılmış bir istisna sınıfıdır

- errorMessage() function oluşturulur
e-mail adresi yanlış ise bir hata mesajı döndürür
- $email string yapısında tanımlanan geçerli bir email adresini tutar

- “try” blogu çalıştırılı ve e-mail adresi geçersiz ise istisna gönderilir

- “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:
Kod:
<?phpclass 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 = “birisi@kodadiweb
com”;try{//denetleif(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){// email adresi yanlış ise istisna gönderthrow new customException($email);}// “birisi” ni mail adresinde ararif(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:
Kod:
Yukardaki kod iki durumda ve iki istisna fırlatma işlemini yorumlar ve denetler;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)errorMessage() oluşturuldu
Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar
$email değişkeni String tabanlıdır ve “birisi” stringini tutar
“try” bloğu çalıştırılır ve ilk durumda istisna fırlatılmaz
İkinci koşulda “birisi” Stringini gördüğü anda istisnayı tetikler
“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:
Kod:
<?phpclass customException extends Exception{public function errorMessage(){//hata mesajı$errorMsg = $this->getMessage()
’ is not a valid E-Mail address
’;return $errorMsg;}}$email = “birisi@kodadiweb
com”;try{try{// “birisi” ni mail adresinde denetleif(strpos($email, “example”) !== FALSE){//mail geçersiz ise istisna fırlatthrow new Exception($email);}}catch(Exception $e){//tekrar fırlatthrow new customException($email);}}catch (customException $e){//özel mesajı yayınlaecho $e->errorMessage();}?>
Örneği Açıklayalım:
Kod:
Yukardaki kod email adresinin “birisi ” stringini içerip içermediğini denetler ,içeriyor ise istisna tekrar gönderilir:- 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
- errorMessage() oluşturuldu
Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar
- $email değişkeni String tabanlıdır ve “birisi” stringini tutar

- “try” bloğu içindeki birbaşka try bloğu koşulu denetler ve tekrar istisna gönderir
- E-mail içeriğinde “birisi” stringi bulunduğunda istisna tetiklenir
- “catch” bloğuistisnayı yakalar ve tekrar bir “customException” gönderir
- “customException” yakalanır ve hata mesajı yayınlar
Kod:
İ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

Kod:
<?phpfunction myException($exception){echo “<b>Exception:</b> ” , $exception->getMessage();}set_exception_handler(’myExceptio n’ );throw new Exception(’Yakalanamayan İstisna oluştu);?>
Yukarıdaki kodun çıktısı şu şekilde görülür:
Kod:
Exception: Yakalanamayan İstisna oluştu
İstisna Kuralları- İstisnalar açısından yakalanabilirliği kolaylaştırmak için try bloğunun içinde olabilir

- Her try yada “throw” bloğu en az bir adet catch bloğuyla ilişkilendirilmeli
- Birden fazla catch bloğu farklı istisna sınıflarını yakalamak için kullanılabilir

- İstisnalar try bloğunun içinde bulunan catch bloğuna fırlatılabilir

Basit bir kural: Bişey fırlatıyorsanız , onu yakalamalısınız
