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;

<?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);

?>

Yukarıdaki kodu çalıştırırsak , aşağıdaki gibi bir hata ile karşılaşırız:

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

Örnek Açıklaması:

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 = “birisi@kodadiweb.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 = “birisi@kodadiweb.com”;

try

{

//denetle

if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)

{

// email adresi yanlış ise istisna gönder

throw new customException($email);

}

// “birisi” ni 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;

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:

<?php

class 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 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 “birisi ” 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 “birisi” 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 “birisi” 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

İ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.

3 thoughts on “PHP – İstisna Yönetimi

  • Öncelikle Türkçe böyle bir servis sağladığınız için çok teşekkürler. Birşey dikkatimi çekti exception “istisna” anlamında değilde “kural dışı durumlar” olarak kullanılırsa daha doğru anlanabiliritesi yüksek olmaz mı?

  • Geri bildirim: Anonim

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir