Öncelikle PHP’nin istisnaları nasıl gördüğü ile ilgili PHP kılavuzuna bir göz atalım.
Bir istisna fırlatıldığında, deyimi izleyen kod çalıştırılmayacak ve PHP ilk eşleşen yakalama bloğunu bulmaya çalışacaktır. Bir istisna yakalanmazsa, set_exception_handler() ile bir eylemci tanımlanmamışsa, “Uncaught Exception …” iletisiyle bir PHP ölümcül hatası verilir.
php.net/exceptions
Yani, bir istisna ile karşılaştığımızda işlevin geri kalanı yürütülmez, bunun yerine ölümcül bir hata oluşur.
İstisnayı yakalarsak, kodun yürütülmesi ilgili yakalama bloğunda devam ederiz, istisna atan işlev ile yakalama bloğu “arasındaki” hiç bir şey yürütülmez.
Peki PHP’de istisnayı nasıl yakalıyoruz?
try/catch
try..catch
blokları, İstisnaların atılabileceği bir programın akışını kontrol etmek için kullanılabilir. Bir istisna ile karşılaşıldığında PHP’nin durmasına izin vermek yerine bu istisnalar yakalanabilir ve zarif bir şekilde ele alınabilir:
try { // Bir sürü şey yaptınız... throw new Exception('Test istisnam!'); } catch (Exception $ex) { // Mantığınız başarısız oldu. Bu konuda ne yapmak istiyorsunuz? Kayda geçirebilirsiniz: file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND); }
Yukarıdaki örnek try bloğunda atılan Exception’ı yakalayacak ve mesajını (“Test istisnam!”) bir metin dosyasına kaydedecektir.
Farklı İstisna türlerini yakalamak
Örneğin, farklı istisna türlerinin farklı şekillerde ele alınması için birden fazla catch deyimi uygulayabilirsiniz:
try { throw new InvalidArgumentException('Argüman #1 bir tamsayı olmalıdır!'); } catch (InvalidArgumentException $ex) { var_dump('Geçersiz argüman istisnası yakalandı: ' . $ex->getMessage()); } catch (Exception $ex) { var_dump('Standart istisna yakalandı: ' . $ex->getMessage()); }
Yukarıdaki örnekte, yürütme sırasına göre önce eşleştiği için ilk catch kullanılacaktır. Eğer catch deyimlerinin sırasını değiştirirseniz, Exception $ex ilk olarak çalıştırılacaktır.
Benzer şekilde, bunun yerine bir UnexpectedValueException atsaydınız, standart bir Exception için ikinci işleyicinin kullanıldığını görürdünüz.
finally
Bir try ya da catch işlemi bittikten sonra bir şey yapılmasını istiyorsanız, finally deyimini kullanabilirsiniz:
try { throw new Exception('Hello world'); } catch (Exception $e) { echo 'Uh oh! ' . $e->getMessage(); } finally { echo " - İş bitti.!"; }
Yukarıdaki örnek aşağıdaki çıktıyı verecektir:
Uh oh! Hello world – İş bitti.!
throwable – fırlatılabilir
PHP 7’de, Exception’ın yanı sıra Error’ın da uyguladığı Throwable arayüzünün tanıtıldığını görüyoruz. Bu, PHP 7’deki istisnalar arasında kendi özel istisnalarınız için arayüzü uygulamanıza olanak tanır:
$handler = function(\Throwable $ex) { $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}"; mail('admin@server.com', $ex->getMessage(), $msg); echo myNiceErrorMessageFunction(); }; set_exception_handler($handler); set_error_handler($handler);
PHP 7’den önce, PHP 5’ten itibaren, tüm istisna sınıfları için sadece Exception sınıfını kullanabilirdiniz.
Hata raporlama ve bunların nerede görüntüleneceğinin ayarlanması
Eğer php.ini’de zaten yapılmamışsa, hata raporlama dinamik olarak ayarlanabilir ve çoğu hatanın gösterilmesine izin verecek şekilde ayarlanmalıdır:
Sözdizimi
int error_reporting ([ int $level ] )
Örnekler
// her zaman 5.4'ten önce kullanılmalıdır error_reporting(E_ALL); // -1 gelecekteki PHP sürümlerinde yeni seviyeler ve sabitler eklendiğinde bile olası tüm hataları gösterecektir. E_ALL'da 5.4 sürümüne kadar aynısını yapar. error_reporting(-1); // bildirimler olmadan error_reporting(E_ALL & ~E_NOTICE); // sadece uyarılar ve bildirimler. error_reporting(E_WARNING | E_NOTICE);
hatalar php tarafından varsayılan olarak, normalde çalışan betikle aynı seviyede bir error.log dosyasında günlüğe kaydedilir.
Geliştirme ortamında, bunları ekranda da gösterebilirsiniz:
ini_set('display_errors', 1);
Bununla birlikte, son üründe
ini_set('display_errors', 0);
yapılmalıdır ve bir İstisna veya Hata işleyicisi kullanarak dostça bir sorun mesajı gösterilir.
Ölümcül hataların kaydedilmesi
PHP’de ölümcül hata, yakalanamayan bir hata türüdür, yani ölümcül bir hatayla karşılaştıktan sonra program devam etmez. Bununla birlikte, bu hatayı günlüğe kaydetmek veya bir şekilde çökmeyi ele almak için kapatma işleyicisini kaydetmek için register_shutdown_function kullanabilirsiniz.
Reference: