PHP Try Catch Örneği: İstisna ve Hata İşleme Eğitimi
İstisna nedir?
Hata, programın kendisi tarafından ele alınamayan beklenmeyen bir program sonucudur.
Program düzeltilerek hatalar giderilir. Bir hata örneği, çalışmayı asla durdurmayan sonsuz bir döngü olabilir.
Bunun bir istisnası, programın kendisi tarafından halledilebilen beklenmeyen program sonucudur.
İstisna örnekleri arasında var olmayan bir dosyayı açmaya çalışmak yer alır.
Bu istisna, dosya oluşturularak veya kullanıcıya dosyayı arama seçeneği sunularak işlenebilir.
Neden istisnayı ele almalısınız?
- Sayfalarımızda son kullanıcılarımızı çok sinirlendirebilecek veya rahatsız edebilecek beklenmedik sonuçlardan kaçının
- Kötü niyetli kullanıcıların uygulamalarımıza saldırmak için kullanabileceği bilgileri açığa çıkarmayarak uygulamalarımızın güvenliğini artırın
- Php İstisnaları, öngörülebilir bir hata meydana gelirse programın normal akışını değiştirmek için kullanılır.
PHP Hata işleme
Yapılandırma ayarlarınıza bağlı olarak bir hata oluştuğunda, PHP Web tarayıcısında, meydana gelen hatayla ilgili bilgilerle birlikte hata mesajını görüntüler.
PHP hataları işlemek için çeşitli yollar sunar.
Yaygın olarak kullanılan üç (3) yönteme bakacağız;
- Kalıp ifadeleri– kalıp işlevi yankı ve çıkış işlevini bir arada birleştirir. Bir hata oluştuğunda bir mesajın çıktısını almak ve betiğin yürütülmesini durdurmak istediğimizde çok kullanışlıdır.
- Özel hata işleyicileri – bunlar, bir hata oluştuğunda çağrılan kullanıcı tanımlı işlevlerdir.
- PHP hata raporlaması – PHP hata raporlama ayarlarınıza bağlı olarak hata mesajı. Bu yöntem, hataya neyin sebep olduğu hakkında hiçbir fikriniz olmadığında geliştirme ortamında çok kullanışlıdır. Görüntülenen bilgiler uygulamanızdaki hataları ayıklamanıza yardımcı olabilir.
Hata işleme örnekleri
Şimdi hata işleme rutinleriyle ilgili bazı basit örneklere bakalım.
Veri depolamak için metin dosyalarını kullanan bir uygulama geliştirdiğimizi varsayalım. Dosyadan veri okumayı denemeden önce dosyanın varlığını kontrol etmek isteyebiliriz.
Aşağıdaki kod yukarıdaki örneği uygular.
<?php $denominator = 0; echo 2 / $denominator; ?>
Simple_error.php dosyasını phptuts klasörüne kaydettiğinizi varsayarak URL'yi açın. http://localhost/phptuts/simple_error.php
Aşağıdaki sonuçları elde edeceksiniz
Yukarıdaki sonuçlardan da görebileceğiniz gibi, uygulamamızın profesyonellikten uzak görünmesine neden olur ve kullanıcıyı rahatsız edebilir.
Yukarıdaki kodu değiştireceğiz ve uygulama için bir hata işleyici yazacağız.
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Yukarıdaki kodu error_handling.php olarak kaydettiğinizi varsayarak URL'yi açın. http://localhost/phptuts/error_handling.php
Not: “Dosya bulunamadı” gibi bir mesaj göstermek yerine yukarıda gösterildiği gibi bir mesaj göstermek iyi bir güvenlik uygulamasıdır.
Özel bir hata işleyici kullanan başka bir örneğe bakalım.
Özel hata işleyici, varsayılan PHP hata işleme işlevi olarak ayarlanacak ve temel olarak bir hata numarası ve mesajı görüntüleyecektir.
Aşağıdaki kod yukarıdaki örneğin uygulanmasını göstermektedir
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
URL'yi aç http://localhost/phptuts/custom_error_handler.php Aşağıdaki sonuçları alacaksınız
Yukarıdaki örnekte görebileceğiniz gibi, özel hata işleyiciler şu anlamda güçlüdür:
- Hata mesajlarını özelleştirmemize izin veriyorlar.
- Özel hata işleyicisi ayrıca bir dosyaya/veritabanına hata kaydı tutma, geliştiriciye e-posta gönderme vb. işlevleri de içerebilir.
Şimdi üçüncü hata işleme türüne bakalım. PHP'nin yerleşik işlevi error_reporting işlevini kullanacağız. Aşağıdaki temel söz dizimine sahiptir
<?php error_reporting($reporting_level); ?>
İŞTE,
- “error_reporting” PHP hata raporlama fonksiyonudur
- “$reporting_level” isteğe bağlıdır ve raporlama düzeyini ayarlamak için kullanılabilir. Herhangi bir raporlama düzeyi belirtilmemişse, PHP, php.ini dosyasında belirtilen varsayılan hata raporlama düzeyini kullanacaktır.
Raporlama Düzeyi | Açıklama | Örnek E-posta |
---|---|---|
E_UYARI | Yalnızca uyarı mesajlarını görüntüler. Komut dosyasının yürütülmesini durdurmaz | error_reporting(E_WARNING); |
E_BİLDİRİM | Bir programın normal yürütülmesi sırasında oluşabilecek veya bir hata olabilecek bildirimleri görüntüler. | error_reporting(E_ NOTICE); |
E_USER_ERROR | Kullanıcı tarafından oluşturulan hataları, yani özel hata işleyicisini görüntüler | error_reporting(E_ USER_ERROR); |
E_USER_WARNING | Kullanıcı tarafından oluşturulan uyarı mesajlarını görüntüler | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Kullanıcı tarafından oluşturulan bildirimleri görüntüler | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Önemli olmayan ve özel hata işleyicileri kullanılarak çözülebilecek hataları görüntüler | error_reporting(E_RECOVERABLE_ERROR); |
E_ALL | Tüm hataları ve uyarıları görüntüler | error_reporting(E_ ALL); |
Hatalar ve İstisna Arasındaki Fark
- Hatalar genellikle düzeltilemezken istisnalar atılır ve yakalanması amaçlanır.
- İstisnalar nesne yönelimli bir şekilde işlenir. Yani bir istisna atıldığında; istisna ayrıntılarını içeren bir istisna nesnesi oluşturulur.
Aşağıdaki tablo istisna nesnesi yöntemlerini göstermektedir
Yöntem | Açıklama | Örnek E-posta |
---|---|---|
getMessage () | İstisnanın mesajını görüntüler |
<?php echo $e->getMessage(); ?> |
getCode() | İstisnayı temsil eden sayısal kodu görüntüler |
<?php echo $e->getCode(); ?> |
dosyayı al() | İstisnanın oluştuğu dosya adını ve yolunu görüntüler |
<?php echo $e->getFile(); ?> |
hat almak() | İstisnanın oluştuğu satır numarasını görüntüler |
<?php echo $e->getLine(); ?> |
getTrace() | İstisnadan önceki geri izleme dizisini görüntüler |
<?php print_r( $e->getTrace()); ?> |
getÖnceki() | Geçerli istisnadan önceki önceki istisnayı görüntüler |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | İstisnanın geriye dönük izini dizi yerine dize olarak görüntüler |
<?php echo $e->getTraceAsString(); ?> |
__toString() | İstisnanın tamamını bir dize olarak görüntüler |
<?php echo $e->__toString(); ?> |
Aşağıda bir istisna fırlatmanın temel sözdizimi gösterilmektedir.
<?php throw new Exception("This is an exception example"); ?>
İŞTE,
- “throw” istisnayı atmak için kullanılan anahtar kelimedir
- “yeni İstisna(…)” bir istisna nesnesi oluşturur ve mesaj parametresi olarak “Bu bir istisna örneğidir” dizesini iletir.
Yukarıdaki kod aşağıdaki mesajı çıktı olarak verir.
Şimdi throw ve catch istisnalarını uygulayan bir örneğe bakacağız.
Yukarıdaki örneği değiştireceğiz ve deneme, fırlatma ve yakalamayı dahil edeceğiz.
Aşağıdaki temel söz dizimine sahiptir.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
İŞTE,
- “try{…}”, potansiyel olarak bir istisna oluşturabilecek, yürütülecek kod bloğudur
- “catch(Exception $e){…}”, atılan istisnayı yakalayan ve istisna nesnesini $e değişkenine atayan kod bloğudur.
Aşağıdaki kod, try, throw ve catch istisnasının uygulandığı temel istisna örneğini gösterir.
Program kasıtlı olarak daha sonra yakalayacağı bir istisna atar.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
URL'yi aç http://localhost/phptuts/exception_handling.php Aşağıdaki sonuçları elde edeceksiniz.
Atılan istisnanın türüne bağlı olarak bir php try ifadesi için birden fazla istisna oluşturmak da mümkündür.
Şununla ilgili makaleye bakın: MySQL, PHP veri erişimi… birden fazla istisnanın uygulama örnekleri için
Çoklu İstisnalar
Çoklu istisna, atılan istisnaları işlemek için birden fazla try catch bloğu kullanır. Birden fazla istisna şu durumlarda faydalıdır;
- Atılan istisnaya bağlı olarak özelleştirilmiş bir mesaj görüntülemek istiyorsunuz
- Atılan istisnaya bağlı olarak benzersiz bir işlem gerçekleştirmek istiyorsunuz
Aşağıdaki akış şeması birden fazla istisnanın nasıl çalıştığını göstermektedir
Birden çok istisna kullanan bir örneğe bakalım.
Bir sayıyı paydaya bölen kodu değiştireceğiz.
İki tür istisnanın oluşmasını bekliyoruz;
- Sıfıra bölüm
- Negatif bir sayıya bölme
Basitlik açısından, catch bloklarımızda yalnızca istisna türünü göstereceğiz.
İstisna sınıfında yerleşik olan PHP, istisnalar atmak için kullanılır.
İstisna sınıfını genişleten iki sınıf oluşturacağız ve bunları istisna atmak için kullanacağız.
Aşağıdaki kod uygulamayı göstermektedir.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Kodu test etme
multiple_ Exceptions.php dosyasını phptuts klasörüne kaydettiğinizi varsayacağız.
URL'ye göz atın http://localhost/phptuts/multiple_exceptions.php
PHP dosyasına geri dönün ve aşağıdaki diyagramda gösterildiği gibi parametre olarak -1'i geçirin.
URL'ye göz atın http://localhost/phptuts/multiple_exceptions.php.
Hangi sonuçları alıyorsunuz? Parametre olarak 3'ü iletin.
Hangi sonuçları alıyorsunuz?
ÖZET
- Hatalar PHP kodunun ürettiği beklenmeyen sonuçlardır
- Hata işleme uygulama performansını artırır
- PHP, PHP'nin hataları raporlama biçimini özelleştirmek için kullanılabilecek yerleşik işlevlere sahiptir
- İstisnalar hatalar gibidir ancak atıldığında catch bloğu kullanılarak yakalanabilirler.
- Hata bilgilerini gösteren hata mesajlarının görüntülenmesi kötü bir güvenlik uygulaması olarak kabul edilir.