PHP İstisna İşleme
- Önceki Sayfa PHP Hata
- Sonraki Sayfa PHP Filtre
İstisna (Exception), belirli bir hata meydana geldiğinde betiğin normal akışını değiştirmek için kullanılır.
İstisna nedir?
PHP 5, yeni bir nesnel yönelimli hata işleme yöntemi sunar.
İstisna işleme, belirli bir hata (istisna) durumunda betiğin normal akışını değiştirmek için kullanılır. Bu durum, istisna olarak adlandırılır.
İstisna tetiklendiğinde, genellikle aşağıdaki gibi olur:
- Mevcut kod durumu kaydedilir
- Kod çalışması, önceden tanımlanmış istisna işleyici fonksiyonuna geçiş yapar
- Duruma bağlı olarak, işleyici, kaydedilmiş kod durumundan tekrar kodu çalıştırmaya başlayabilir, betiği durdurabilir veya kodun başka bir yerinden betiği devam ettirebilir
Farklı hata işleme yöntemlerini göstereceğiz:
- İstisna temel kullanımı
- Özel bir istisna işleyicisi oluşturmak
- Çoklu istisnalar
- İstisna yeniden atma
- Üst düzey istisna işleyicisi ayarlamak
İstisna temel kullanımı
İstisna atıldığında, sonraki kod çalışmayacak, PHP, eşleşen "catch" kod bloğunu aramaya çalışacaktır.
Eğer istisna yakalanmadı ve set_exception_handler() ile uygun bir işlem yapılmadıysa, ciddi bir hata (ölümcül hata) meydana gelecek ve "Yakalanmamış İstisna" (yakalanmamış istisna) hatası mesajı çıktı verecektir.
Bir istisna atmaya çalışalım, onu yakalamadan:
<?php //istisna ile dolu fonksiyon oluştur function checkNum($number) { if($number>1) { throw new Exception("Değer 1 veya altında olmalıdır"); } return true; } //istisna tetikle checkNum(2); ?>
Yukarıdaki kod, benzeri bir hatayı elde edebilir:
Ölümcül hata: yakalanmamış istisna 'Exception' mesaj 'Değer 1 veya altında olmalıdır' ile C:\webfolder\test.php:6 Yığın takibi: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} C:\webfolder\test.php dosyasında satır 6'da atıldı
Try, throw ve catch
Yukarıdaki örnekteki hatayı önlemek için, hataları işlemek için uygun kod oluşturmamız gerekmektedir.
Düzenli bir işleyici, aşağıdaki gibi içerir:
- Deneme - Hata ile çıkan fonksiyonlar "try" kod bloğu içinde yer almalıdır. Eğer bir hata tetiklenmezse, kod normal şekilde devam edecektir. Ancak, bir hata tetiklendiğinde, bir hata atılacaktır.
- Throw - Burada hata tetiklenme şekli belirlenir. Her bir "throw", en az bir "catch" ile karşılık gelmelidir
- Catch - "catch" kod bloğu, hatayı yakalar ve hata bilgilerini içeren bir nesne oluşturur
Bir hata tetikleyelim:
<?php //Bir hatayı atabilecek fonksiyon oluşturma function checkNum($number) { if($number>1) { throw new Exception("Değer 1 veya altında olmalıdır"); } return true; } //"try" kod bloğu içinde hata tetiklenir try { checkNum(2); //Eğer hata atılırsa, bu metin gösterilmeyecektir echo 'Bu yazıyı görüyorsanız, sayı 1 veya altındadır'; } //Hata yakalama catch(Exception $e) { echo 'Mesaj: ' .$e->getMessage(); } ?>
Yukarıdaki kod, şu tür bir hata alır:
Mesaj: Değer 1 veya altında olmalıdır
Örnek açıklaması:
Yukarıdaki kod bir hata atar ve onu yakalar:
- checkNum() fonksiyonunu oluşturma. Bu fonksiyon, sayının 1'den büyük olup olmadığını kontrol eder. Eğer büyükse, bir hata atar.
- "try" kod bloğu içinde checkNum() fonksiyonu çağrılır.
- checkNum() fonksiyonundaki hata atılır
- "catch" kod bloğu bu hatayı alır ve hata bilgilerini içeren bir nesne ($e) oluşturur.
- Bu exception nesnesinden $e->getMessage() çağrısını yaparak, bu hatanın hatırlatıcı mesajını çıkarabilirsiniz.
Ancak, “her throw'a bir catch” ilkesine uyum sağlamak için, atılan hataları işleyebilecek üst düzey bir hata işleyici ayarlayabilirsiniz.
Özelleştirilmiş bir Exception sınıfı oluşturma
Özelleştirilmiş bir hata işleyici oluşturmak çok basittir. PHP'te bir hata olduğunda fonksiyonlarını çağırabileceğimiz özel bir sınıf oluşturduk. Bu sınıf, exception sınıfının bir uzantısı olmalıdır.
Bu özelleştirilmiş exception sınıfı PHP'nin exception sınıfının tüm özelliklerini devralır, özelleştirilmiş fonksiyonlar ekleyebilirsiniz.
Başlangıçta exception sınıfını oluşturuyoruz:
<?php class customException extends Exception { public function errorMessage() { //hata mesajı $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() : <b>'.$this->getMessage().'</b> geçerli bir E-posta adresi değil return $errorMsg; } } $email = "someone@example...com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //e-posta geçersizse istisna fırlat throw new customException($email); } } catch (customException $e) { //özel mesaj göster echo $e->errorMessage(); } ?>
Bu yeni sınıf eski exception sınıfının bir kopyasıdır ve errorMessage() fonksiyonu eklenmiştir. Çünkü eski sınıfın bir kopyasıdır, bu yüzden eski sınıftan özellikler ve yöntemler miras alır, exception sınıfının yöntemlerini kullanabiliriz, örneğin getLine(), getFile() ve getMessage().
Örnek açıklaması:
Yukarıdaki kod bir istisna attı ve bu istisnayı bir özelleştirilmiş exception sınıfı ile yakaladı:
- customException() sınıfı, eski exception sınıfının bir genişlemesi olarak oluşturuldu. Bu, eski sınıfın tüm özelliklerini ve yöntemlerini miras alır.
- errorMessage() fonksiyonu oluşturun. E-posta adresi geçersizse, bu fonksiyon bir hata mesajı döndürür
- $email değişkenini geçersiz bir e-posta adresi dizisi olarak ayarlayın
- "try" kod bloğu çalıştırılır, e-posta adresi geçersiz olduğundan bir istisna atılır
- "catch" kod bloğu istisnayı yakalar ve hata mesajını gösterir
Çoklu istisnalar
Bir betiği birden fazla istisna ile kullanarak çeşitli durumları denetleyebilirsiniz.
Birden fazla if..else kod bloğu, veya bir switch kod bloğu, veya birden fazla istisna içeren bir yapı kullanabilirsiniz. Bu istisnalar farklı exception sınıflarını kullanabilir ve farklı hata mesajları döndürebilir:
<?php class customException extends Exception { public function errorMessage() { //hata mesajı $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() : <b>'.$this->getMessage().'</b> geçerli bir E-posta adresi değil return $errorMsg; } } $email = "someone@example.com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //e-posta geçersizse istisna fırlat throw new customException($email); } //e-posta adresinde "example" kontrol et if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Örnek açıklaması:
Yukarıdaki kod, iki koşulu nasıl test ettiğini ve herhangi bir koşulun geçerli olmadığında bir istisna attığını gösterir:
- customException() sınıfı, eski exception sınıfının bir genişlemesi olarak oluşturuldu. Bu, eski sınıfın tüm özelliklerini ve yöntemlerini miras alır.
- errorMessage() fonksiyonu oluşturuldu. E-posta adresi geçersizse, bu fonksiyon bir hata mesajı döndürür.
- İlk koşulda istisna atılmadığı için "try" kod bloğu çalıştırılır.
- E-posta "example" dizisini içerdiğinden, ikinci koşul istisnayı tetikler.
- "catch" kod bloğu istisnayı yakalar ve uygun hata mesajını gösterir
customException yakalanmadıysa ve sadece temel istisna yakalandıysa, orada istisna işlenir.
İstisna yeniden atma
Bazen, istisna atıldığında, onunla standart bir şekilde işlemek istemediğiniz zamanlar olur. Bir "catch" kod bloğunda tekrar istisna atabilirsiniz.
Betik, kullanıcıya sistem hatalarını gizlemelidir. Sistem hataları programcılar için önemli olabilir, ancak kullanıcılar onlara ilgi duymaz. Kullanıcıların daha kolay kullanması için, kullanıcıya daha dostane bir mesajla birlikte fırlatılan hata istisnalarını tekrar fırlatabilirsiniz:
<?php class customException extends Exception { public function errorMessage() { //hata mesajı $errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //e-posta adresinde "example" kontrol et if(strpos($email, "example") !== FALSE) { //e-posta geçersizse istisna fırlat throw new Exception($email); } } catch(Exception $e) { //istisnayı tekrar fırlat throw new customException($email); } } catch (customException $e) { //özel mesaj göster echo $e->errorMessage(); } ?>
Örnek açıklaması:
Yukarıdaki kod, e-posta adresinde "example" dizisinin olup olmadığını tespit eder. Varsa, tekrar istisna fırlatılır:
- customException() sınıfı, eski exception sınıfının bir genişlemesi olarak oluşturuldu. Bu, eski sınıfın tüm özelliklerini ve yöntemlerini miras alır.
- errorMessage() fonksiyonu oluşturuldu. E-posta adresi geçersizse, bu fonksiyon bir hata mesajı döndürür.
- $email değişkeni, "example" dizisini içeren geçerli bir e-posta adresi olarak ayarlandı.
- "try" kod bloğu içinde başka bir "try" kod bloğu içerir, böylece istisna tekrar fırlatılabilir.
- e-posta "example" dizisini içerdiği için istisna tetiklendi.
- "catch" bu istisnayı yakaladı ve "customException" yeniden fırlatildi.
- customException yakalandı ve bir hata mesajı gösterildi.
Şu andaki "try" kod bloğunda istisna yakalanmadıysa, daha yüksek seviyede catch kod bloğu arar.
Üst Düzey İstisna İşleyici (Top Level Exception Handler) Ayarlama
set_exception_handler() fonksiyonu, tüm yakalanmamış istisnaları işleyen kullanıcı tanımlı fonksiyonu ayarlar.
<?php function myException($exception) { echo "<b>İstisna:</b> " , $exception->getMessage(); } set_exception_handler('myException'); new Exception('Yakalanmamış İstisna Oluştu'); ?>
Yukarıdaki kodun çıktısı şu gibi olmalıdır:
Exception: Yakalanmamış İstisna Oluştu
Yukarıdaki kodda "catch" kod bloğu yok, bunun yerine üst düzey istisna işleme programı tetikleniyor. Tüm yakalanmamış istisnaları yakalamak için bu fonksiyonu kullanmalıyız.
İstisna Kuralları
- İstisna işleme gerektiren kodlar, potansiyel istisnaları yakalamak için try kod bloğu içine konmalıdır.
- Her try veya throw kod bloğu en az bir catch kod bloğu içermelidir.
- Çeşitli türdeki istisnaları yakalamak için birden fazla catch kod bloğu kullanılabilir.
- Bir try kod bloğu içinde bir catch kod bloğu içinde tekrar atılabilir (yeniden atılabilir) istisna.
Kısaca: Bir istisna atıldıysa, mutlaka yakalanmalıdır.
- Önceki Sayfa PHP Hata
- Sonraki Sayfa PHP Filtre