Php Dersleri – Hata Yönetimi

Merhaba arkadaşlar mobilhanem.com için hazırladığımız  Php derslerimizde bu ders Hata Yönetimi nasıl yapılır beraber göreceğiz. Php yorumlanan bir dil olduğu için debug yapmak derlenen dillere göre biraz daha kolaydır. Hata Yönetimi bizim birçok işimizi kolaylaştırır. Örneğin sistem test halindeyken hataları loglayabilir, veya bu hataları mail olarak göndertebiliriz. Php nin güzel tarafı hataları istersek tamamen gizleyebilir veya belirli seviyedeki hataları sadece açabiliriz.

Hataları Göstermek

Phpde hataları istersek tamamen görünmez veya belirlediğimiz kısmını görünür hale getirebiliriz. Php.ini dosyamızda display_errors ve display_startup_errors olarak iki tane temel hata ayıklama parametresi vardır bu parametreleri açarak tüm sunucuda hataları gösterebiliriz. Genellikle tüm sunucuda hataları göstermek istemeyiz sadece çalıştığımız sayfayı debug etmek isteriz, bu yüzden sadece çalıştığımız sayfada bu hataları açmak için ini_set() fonksiyonunu kullanarak bu değerleri değiştirebiliriz. 

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1);

 

Artık tüm hataları gösterilebilir hale getirdik. Şimdi error_reporting() fonksiyonunu kullanarak hangi hataları görmek istediğimizi belirleyelim.  error_reporting fonksiyonuna ait birçok parametre var bunları aşağıdaki listede görebilirsiniz.

 

Değer Sabit
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
8192 E_DEPRECATED
16384 E_USER_DEPRECATED
32767 E_ALL

 

Hata açıklamaları içi php.net e bakabilirsiniz.

Kullanımı:

// E_NOTICE hariç bütün hataları göster
error_reporting(E_ALL ^ E_NOTICE);

// Tüm PHP hatalarını göster
error_reporting(E_ALL);

Örneğin:

error_reporting(E_ALL);
echo $a; // tanımlı olmayan bir değişkeni ekrana yazdırmaya çalışalım. 

// hata çıktısı 
// Notice: Undefined variable: a in index.php  on line 3

Hatanın hangi satırda ve neden kaynaklandığını, hatanın türünü görmüş oluyoruz.

Şimdiye kadar Php nin bizim için gösterdiği yorumlama hatalarına baktık. Peki çalışma anında kullanıcıdan kaynaklı veya anlık bir problemden kaynaklı hatalar için nasıl çözüm üreteceğiz? Hiçkimse yayında olan bir sistem için kullanıcıya bir hata logu göstermek istemez bu yüzden hataları nasıl yönetebileceğimize bakalım.

Hata Yönetimi

Hataları yönetmek için try catch bloğunu kullanırız.  Hatayı önce biz fırlatırız throw new Exception() daha sonra fırlattığımız hatayı yine biz yakalarız. Örnek üzerinden gidersek dahada anlaşılır olacaktır.

Örneğin: Bir insanın yaşı 18 den büyükmü değilmi kontrol yapalım.

Olabilecek hatalar:

  • yaş değişkeni tanımlı olmayabilir
  • yaş değeri numeric olmayabilir
  • yaş sıfıra eşit veya küçük olabilir

Bu üç hatadan biri varsa sistem ilerleyemez bizde bu 3 hatayı kontrol edip eğer bunlardan biri gerçekleşmişse bir hata fırlatacağız ve bu hatayı kendimiz yakalayacağız.

//$yas = 0;
//$yas = "vehbi";
// $yas = 18;
try{
  if(!isset($yas)) {
   throw new Exception("Yaş Tanımlı Değil");  
  }else if(!is_numeric($yas)) {
    throw new Exception("Yaş numeric bir değer olmalıdır.");   
  }else if($yas <= 0) {
    throw new Exception("Yaş 0 dan büyük olmalıdır.");
  }else {
    echo $yas >18 ? "18 Yaşından Büyük" : "18 Yaşından Büyük Değil!";
  }

}catch(Exception $e) {
  // hata varsa catch bloğu çalışır ve hata yakalanır. 
 echo $e->getMessage();

}

Örnekteki açıklama satırı halindeki $yas değişkenlerini sırayla açarak hataları sizde görebilirsiniz. En son $yas = 18 kısmını açtığınızda try bloğunun başarılı bir şekilde çalıştığını görebilirsiniz.

Exception bir sınıf olduğu için bu sınıfı miras alarak kendimize ait bir exception sınıfıda oluşturabiliriz. Kısaca kalıtım konusunu hatırlamak için Php OOP Dersleri – Kalıtım dersimize bakabilirsiniz.

Şimdi kendi sınıfımızı oluşturup hatayı kendi sınıfımızdan yakalayalım.

class YasException extends Exception {

  public function customErrorMsg() {
      echo parent::getFile()." dosyasında ".parent::getLine().". Satırda ".parent::getMessage();  
  }

}

$yas = 0;

try{
  if(!isset($yas)) {
   throw new YasException("Yaş Tanımlı Değil");  
  }else if(!is_numeric($yas)) {
    throw new YasException("Yaş numeric bir değer olmalıdır.");   
  }else if($yas <= 0) {
    throw new YasException("Yaş 0 dan büyük olmalıdır.");
  }else {
    
    echo $yas;
    }

}catch(YasException $e) {

 echo $e->customErrorMsg();

}

Kendi sınıfımız ile hatanın hangi dosyanın hangi satırında olduğunu gösterdik. Bu özellikler Exception sınıfının kendi özellikleri istersek ekstra kendimizde isteğimize göre özellikler ekleyebiliriz.

 

Bir dersimizin daha sonuna geldik bir sonraki dersimizde görüşmek dileğiyle ?

 

Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı yine konu altından ve Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

Tüm php dersleri için tıklayınız..

 

 

15

Vehbi Akdoğan

Erzurum Atatürk Üniversitesi Bilgisayar Mühendisliği Mezunu
Web & Android Developer
#erzurumspor

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?