PHP Try Catch Örneği: İstisna ve Hata İşleme Eğitimi
⚡ Akıllı Özet
PHP'de hata yönetimi ve istisnalar, beklenmedik durumları yöneterek ve ham hataları ortaya çıkarmak yerine uygulamaları istikrarlı ve güvenli tutar. Bu kılavuz, hatalar ve istisnalar arasındaki farkı, `die` ifadelerini, özel hata işleyicilerini, hata raporlama seviyelerini ve birden fazla istisna türüyle `try`, `throw` ve `catch` istisna modelini açıklamaktadır.

İ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.
İstisna, programın kendisi tarafından ele alınabilen, beklenmedik bir 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.
İstisnaları neden ele almalıyız?
- Sayfalarımızda son kullanıcılarımız için çok can sıkıcı veya rahatsız edici olabilecek 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 istisnaları, öngörülebilir bir hata oluşması durumunda 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ı ele almak için çeşitli yöntemler sunar. Biz de yaygın olarak kullanılan üç yönteme göz atacağız:
- Kalıp ifadeleri – `die` fonksiyonu, `echo` ve `exit` fonksiyonlarını bir araya getirir. Bir hata oluştuğunda mesaj çıktısı vermek ve komut dosyasının çalışmasını 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ı – Hata mesajı, PHP hata raporlama ayarlarınıza bağlıdır. Bu yöntem, hatanın nedenini bilmediğiniz geliştirme ortamlarında çok kullanışlıdır. Görüntülenen bilgiler, uygulamanızda hata ayıklamanıza yardımcı olabilir.
Hata işleme örnekleri
Şimdi hata işleme rutinleri içeren bazı basit örneklere bakalım.
Diyelim ki bir sayıyı sıfıra bölebilecek bir işlemimiz var. PHP'nin ham bir hata göstermesine izin vermek yerine, bu durumu temiz bir şekilde ele almak istiyoruz.
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, dosyayı açın. URL 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, dosyayı açın. URL http://localhost/phptuts/error_handling.php
Not: Yukarıda gösterilene benzer bir mesajı, "Dosya bulunamadı" gibi ham bir mesaj göstermek yerine görüntülemek 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 "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Açın URL http://localhost/phptuts/custom_error_handler.phpAşağıdaki sonuçları elde edeceksiniz.
Yukarıdaki örnekten de görebileceğiniz gibi, özel hata işleyicileri şu açılardan güçlüdür:
- Hata mesajlarını özelleştirmemize izin veriyorlar.
- Özel hata işleyici, hata kayıtlarını bir dosyaya veya veritabanına kaydetmeyi, geliştiriciye e-posta göndermeyi ve benzer işlemleri de içerebilir.
Şimdi üçüncü hata işleme türüne bakalım. PHP'nin yerleşik `error_reporting` fonksiyonunu kullanacağız. Temel sözdizimi şu şekildedir:
<?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. | hata_bildirimi(E_BİLDİRİM); |
| E_USER_ERROR | Kullanıcı tarafından oluşturulan hataları, yani özel bir hata işleyiciyi görüntüler. | hata_bildirimi(E_KULLANICI_HATASI); |
| 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 | Ölümcül olmayan ve özel hata işleyicileri kullanılarak ele alınabilen 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
- İstisnalar fırlatılır ve yakalanması amaçlanır, oysa hatalar genellikle geri döndürülemez.
- İstisnalar nesne yönelimli bir şekilde ele alınır. Bu, bir istisna oluştuğunda, istisna ayrıntılarını içeren bir istisna nesnesi oluşturulduğu anlamına gelir.
Aşağıdaki tabloda istisna nesnesi yöntemleri gösterilmektedir.
| Yöntem | Açıklama | Örnek E-posta |
|---|---|---|
| getMessage () | İstisnanın mesajını görüntüler |
<?php
echo $e->getMessage();
?>
|
| almakCode() | İ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();
?>
|
| almakTrace() | Arka taraftaki nesnelerin bir dizisini görüntüler.tracistisnadan önce e |
<?php print_r( $e->getTrace()); ?> |
| getÖnceki() | Geçerli istisnadan önceki önceki istisnayı görüntüler |
<?php
echo $e->getPrevious();
?>
|
| almakTraceAsString() | Arka tarafı gösterir.tracİstisnanın bir dizi yerine bir dize olarak e'si |
<?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
- “new Exception(…)” ifadesi bir istisna nesnesi oluşturur ve “Bu bir istisna örneğidir” dizesini mesaj parametresi olarak 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ştirip `try`, `throw` ve `catch` yapılarını ekleyeceğ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 yapılarının uygulandığı temel bir istisna örneğini göstermektedir. Program, kasıtlı olarak bir istisna fırlatır ve ardından bu istisnayı yakalar.
<?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(); } ?>
Açın URL http://localhost/phptuts/exception_handling.phpAşağıdaki sonuçları elde edeceksiniz.
Ayrıca, fırlatılan istisna 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: MySQLPHP veri erişimi için birden fazla istisnanın uygulanmasına ilişkin örnekler.
Çoklu İstisnalar
Birden fazla istisna, fırlatılan istisnaları ele almak için birden fazla yakalama 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 fazla istisna kullanan bir örneğe bakalım. Bir sayıyı paydaya bölen kodu değiştireceğiz.
İki tür istisnanın meydana gelmesini 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. İstisnaları fırlatmak için PHP'nin yerleşik Exception sınıfı kullanılır. Exception sınıfını genişleten iki sınıf oluşturacağız ve bunları istisna fırlatmak 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 varsayıyoruz.
Şuraya göz atın: URL 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.
Şuraya göz atın: URL http://localhost/phptuts/multiple_exceptions.phpNe sonuçlar elde ediyorsunuz? Şimdi parametre olarak 3'ü geçirin. Ne sonuçlar elde ediyorsunuz?
Son Blok ve PHP 7 Hata Modeli
Modern PHP, yukarıdaki modele iki önemli unsur daha ekler. `finally` bloğu, bir istisna fırlatılıp fırlatılmadığına bakılmaksızın `try` ve `catch` bloklarından sonra çalışır; bu da onu dosya kapatma veya veritabanı bağlantısını kapatma gibi temizleme işlemleri için ideal hale getirir.
PHP 7'den beri, birçok eski ölümcül hata Error nesneleri olarak fırlatılıyor. Hem Exception hem de Error, Throwable arayüzünü uyguladığından, bir catch (\Throwable $e) bloğu her ikisini de ele alabilir.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
Burada, PHP 8'de sıfıra bölme işlemi DivisionByZeroError hatası verir, catch bloğu bunu bildirir ve finally bloğu, hata oluşup oluşmadığına bakılmaksızın her zaman çalışır ve mesajını yazdırır.








