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.

  • ⚠️ Hata ve İstisna Arasındaki Fark: Bir hata genellikle geri döndürülemezken, bir istisna programın yakalayabileceği ve işleyebileceği beklenmedik bir sonuçtur.
  • 🛡️ Neden Ele Alınmalı: Hata yönetimi, istenmeyen çıktıları önler, kullanıcıları korur ve saldırganların istismar edebileceği bilgilerin sızmasını engeller.
  • 🛑 Beyanlar: `die` fonksiyonu bir mesaj yazdırır ve betiği durdurur; bu, bir şey başarısız olduğunda yürütmeyi durdurmanın hızlı bir yoludur.
  • Özel İşleyiciler: `set_error_handler()` fonksiyonu, hataları kendi fonksiyonunuza yönlendirerek, hataları kaydetmenize, e-posta göndermenize veya mesajları istediğiniz şekilde biçimlendirmenize olanak tanır.
  • 📢 Hata Bildirimi: `error_reporting()` ve `E_ALL` gibi seviyeler, PHP'nin hangi uyarıları ve bildirimleri göstereceğini kontrol eder; bu da geliştirme sırasında faydalıdır.
  • 🧲 Dene, At, Yakala: `try` bloğu riskli kodu çalıştırır, `throw` bir istisna oluşturur ve `catch` istisna nesnesinin yöntemlerini kullanarak bu istisnayı ele alır.
  • 🤖 Yapay Zeka Yardımı: Yapay zeka araçları, mevcut koda try-catch bloğu ekleyebilir ve kafa karıştırıcı bir kod yığınını açıklayabilir. trace veya hata mesajı.

PHP Hata Yönetimi ve İstisnalar

İ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:

  1. 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.
  2. Özel hata işleyicileri – bunlar, bir hata oluştuğunda çağrılan kullanıcı tanımlı işlevlerdir.
  3. 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.

PHP Hata işleme

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

PHP'de PHP İstisna Kolu

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.

PHP Hata işleme

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.

PHP'de PHP İstisna Kolu

Ş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.

PHP'de PHP İstisna Kolu

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.

Çoklu İstisnalar

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'de PHP İstisna Kolu

PHP dosyasına geri dönün ve aşağıdaki diyagramda gösterildiği gibi parametre olarak -1'i geçirin.

PHP'de PHP İstisna Kolu

Ş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.

SSS

Üretim ortamında, php.ini dosyasında display_errors'ı Off ve log_errors'ı On olarak ayarlayın ve error_log'u bir dosyaya yönlendirin. Ayrıca, ziyaretçilere hiçbir şey göstermeden özel kayıtlar almak için error_log('mesaj') çağrısını da yapabilirsiniz.

`try-catch` yapısı, `throw` anahtar kelimesiyle fırlatılan istisnaları ele alır. `set_error_handler` ise geleneksel PHP hatalarını ve uyarılarını yakalar. PHP 7 ve sonrasında, birçok eski hata `Error` nesneleri olarak fırlatılır ve bunları da yakalayabilirsiniz.

Yakalanmayan bir istisna ölümcül bir hataya dönüşür, betiği durdurur ve yığın iziyle birlikte "Yakalanmayan İstisna" mesajını yazdırır. trace. set_exception_handler ile tanımlanmış global bir işleyici, son çare olarak bunları yakalayabilir.

Evet. Yapay zeka, riskli işlemleri try-catch bloklarına sarabilir, doğru istisna türlerini seçebilir, temizlik için finally bloğu ekleyebilir ve hatayı kaydedebilir. RevGörmeniz gereken istisnaları göz ardı etmediğini unutmayın.

Evet. Mesajı yapıştırın ve trace ve yapay zeka, başarısız olan satırı, oraya yol açan çağrı zincirini ve olası nedeni belirleyebilir ve ardından boş değer kontrolü veya düzeltilmiş argüman gibi bir düzeltme önerebilir.

Bu yazıyı şu şekilde özetleyin: