PHP’deki Dersler: Hataları ve Hata İşleme’yi Göster

PHP, günümüzün en popüler sunucu tarafı web programlama dilidir, bu nedenle PHP kodunuz yürütüldüğünde oluşabilecek hataları nasıl çözeceğinizi bilmek önemlidir..


Bu makalede, PHP’de hata işleme, yerleşik işlevleri kullanma, özel hata işleyici işlevleri yazma ve Özel Durum hata işleme ile ilgili temel bilgileri inceleyeceğiz.

PHP’de Hata Türleri

Yazılımda iki temel hata türü vardır:

  • Dahili Hatalar: Bunlar kodunuzdaki mantık hatalarıdır. Dikkatli programlama ile bu hatalar büyük ölçüde önlenebilir..
  • Dış Hatalar: Bunlar, kodunuzun dışındaki dünyayla etkileşimlerle ilgili hatalardır (örneğin, bir dosya veya veritabanını açamama, ağ bağlantısı düşme, belirli bir PHP modülünü yükleyememe vb.). Bu hatalar her zaman meydana gelecektir, ancak etkileri hafifletilebilir. Kodunuzu bu harici hatalar için ne kadar iyi hazırlarsanız, kodunuz yürütülürken olabildiğince az varsayarak, bu hatalar programınızı daha az olumsuz etkiler.

PHP Hataları ile başa çıkma yolları

Hatalar meydana geldiğinde ve bunları tespit ettiğimizde, bunlarla başa çıkmanın dört temel yolu vardır:

  • Hatayı Görüntüle: Bu, program yürütülürken hatanın geliştiriciye ve / veya kullanıcıya gösterilmesini sağlar.
  • Hatayı Günlüğe Kaydet: Bu, hataların bir metin günlük dosyasından depolanmasına ve incelenmesine olanak tanır.
  • Hata Yasası: Gereken eylem türü her program durumu için farklı olacaktır.
  • Hatayı Yoksay: Bundan daima kaçınılmalıdır.

Bu makalede, hataların görüntülenmesi, günlüğe kaydedilmesi ve işlenmesine odaklanacağız. Hataları nasıl ele aldığınızı öğrendikten sonra, bunlarla kolayca başa çıkabilirsiniz.

Hataları ve Hata Raporlama Ayarlarını Gösterme

Üretimde veya geliştirmede kod çalıştırdığımıza bağlı olarak, belirli hata türlerini bildirmeyi açmak veya kapatmak isteyebiliriz.

Hangi hata türlerinin raporlanacağını kontrol edebileceğimiz farklı yerler vardır:

  • Php.ini dosyasında
  • Web sunucunuzdaki .htaccess dosyasında
  • Kendi PHP kodunuzdan.

PHP hata yapılandırma değerlerinin tam bir açıklaması burada bulunabilir. Bunlar, varsayılan değerleri ile en alakalı seçeneklerdir:

PHP Hatalarını Gösterme Seçenekleri

PHP hatalarını göstermek için dört olası seçenek vardır:

  • error_reporting: Hata raporlama seviyesini ayarlayın. Varsayılan değer: “E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED, ”, bu ayarın E_NOTICE, E_STRICT ve E_DEPRECATED düzey hatalarını göstermediği anlamına gelir.
  • display_errors: Hatalar ekrana yazdırılacaksa bunu “AÇIK” olarak ayarlayın (varsayılan “KAPALI” dır).
  • log_errors: Bu, hata günlüğünün yapılması gerekip gerekmediğini gösterir; varsayılan değer “açık” tır.
  • error_log dizesi: Komut dosyası hatalarının günlüğe kaydedileceği dosyanın adını ayarlar

Bu yapılandırma seçeneklerini nasıl kullanabileceğimizi görelim.

Geliştirme sırasında php.ini dosyasındaki tüm hata raporlarını açmak isteyebiliriz:

1
2

display_errors = açık

error_reporting = E_ALL

Aynı şeyi error_reporting () fonksiyonunu çağırarak PHP kodumuzdan da yapabiliriz:

1 (E_ALL) error_reporting;

Hata günlüğünü açmak ve hataları kendi özel günlük dosyamıza (genellikle web sunucusu hata günlük dosyası veya syslog dosyası olan varsayılan hata günlük dosyası yerine) kaydetmek için PHP’yi aşağıdakilerle yapılandırabiliriz:

1
2

log_errors = açık

error_log = "/tmp/php-error.log"

Artık hataları PHP kodunuzla kaydedebilirsiniz:

1 error_log ( "Bu kodda hatalar var!" );

Dahili Hata Seviyeleri

PHP’nin şu anda her biri kendi tanımlayıcı (bitmask) numarası olan 15 önceden tanımlanmış hata sabiti vardır. Bunlar, PHP’nin veya geliştiricinin bir hata oluştuğunda tetikleyebileceği yerleşik hata türleridir. Bir sonraki bölümde göreceğimiz gibi hangi hata türlerinin bildirilmesini istediğinize karar verebilirsiniz..

Bunlar yerleşik PHP hata türleridir:

tip
Açıklama
E_ERRORÖnemli çalışma zamanı hataları
E_WARNINGÇalışma zamanı uyarıları (önemli olmayan hatalar)
E_PARSEDerleme zamanı ayrıştırma hataları
E_NOTICEÇalışma zamanı bildirimleri
E_CORE_ERRORPHP’nin ilk açılışında meydana gelen önemli hatalar
E_CORE_WARNINGPHP’nin ilk açılışında meydana gelen uyarılar (önemli olmayan hatalar)
E_COMPILE_ERRORÖnemli derleme zamanı hataları
E_COMPILE_WARNINGDerleme zamanı uyarıları (önemli olmayan hatalar)
E_USER_ERRORKullanıcı tarafından oluşturulan hata mesajı
E_USER_WARNINGKullanıcı tarafından oluşturulan uyarı mesajı
E_USER_NOTICEKullanıcı tarafından oluşturulan bildirim mesajı
E_STRICTPHP’nin kodunuzda en iyi birlikte çalışabilirliği ve kodunuzun ileri uyumluluğunu sağlayacak değişiklikler yapmasını önerin
E_RECOVERABLE_ERRORYakalanabilir ölümcül hata
E_DEPRECATEDÇalışma zamanı bildirimleri
E_USER_DEPRECATEDKullanıcı tarafından oluşturulan uyarı mesajı
E_ALLDesteklendiği gibi tüm hatalar ve uyarılar

Tetiklenen bu hata sabitlerinin bazı kod örnekleri:

1
2
3
4
5
6
7
8
9
10
11
12
13

// E_ERROR

nonExistingFunction ();

 
// E_UYARI

$ fh = fopen (‘mevcut olmayan dosya’, ‘r’);

 
// E_NOTICE

$ x = $ y + 5; // $ y tanımlanmadı

 
// E_USER_ERROR

if ($ divisor == 0) {

    trigger_error ("Sıfıra bölünemez", E_USER_ERROR); // geliştirici tarafından tetiklenen hata

}

Özel Hata İşleyicileri Oluşturma

Şimdi PHP’yi hangi tür hatalar hakkında rapor verileceğini söyleyecek şekilde yapılandırabileceğimize göre, farklı hata türlerini kendi yöntemimizle ele alabilmemiz gerekiyor. Sadece standart PHP hata mesajlarını görüntülemek genellikle yeterli değildir.

Bir hata oluştuğunda hatayı işlemek ve kendi mesajlarımızı görüntülemek istiyoruz. Bunun için set_error_handler () işlevini kullanabiliriz.

İşte çok basit bir özel hata işleme fonksiyonu:

1
2
3
4
5
6
7
8
9
10

// hata işleyici işlevi

function errorHandler ($ errno, $ errstr) {

  Eko "Hata: [$ errno] $ errstr";

}
 
// hata işleyiciyi ayarla

set_error_handler ("errorHandler");

 
// bir hatayı tetikle

echo ($ foo); // Tanımsız değişken!

Bu nedenle, bir hata oluştuğunda, hata numarası bağımsız değişkeni ve hata dizesi bağımsız değişkeni ile özel hata işleyici işlevi çağrılır. Bu iki argüman set_error_handler () çağrısından fonksiyonumuza aktarılır.

Yakında göreceğimiz gibi kullanabileceğimiz daha fazla argüman var, ancak bu kodu çalıştırmanın çıktısı şöyle olacaktır:

1 Hata: [8] Tanımsız değişken: foo

Biraz daha az basit bir özel hata işleme işlevinin nasıl görünebileceğini görelim. Bu hata işleyici, hata türlerini algılayabilmeli ve hangi eylemin gerçekleştirileceğine ve / veya hangi hata mesajının gösterileceğine karar verebilmelidir..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

function errorHandler ($ errno, $ errstr, $ errfile, $ errline) {

 

    switch ($ errno) {

        vaka E_NOTICE:

        vaka E_USER_NOTICE:

        vaka E_DEPRECATED:

        vaka E_USER_DEPRECATED:

        vaka E_STRICT:

            Eko("$ Errfile konumunda $ errstr STRICT hatası: $ errline n");

            break;

 

        vaka E_UYARI:

        durum E_USER_WARNING:

            Eko("UYARI hatası $ errfile’da $ errstr: $ errline n");

            break;

 

        vaka E_ERROR:

        vaka E_USER_ERROR:

        vaka E_RECOVERABLE_ERROR:

            çıkış("$ Errfile dosyasında $ errstr FATAL hatası: $ errline n");

 

        varsayılan:

            çıkış("$ Errfile konumunda bilinmeyen hata: $ errline n");

    }

}
 

set_error_handler ("errorHandler");

 

$ foo = yanlış;

 

eğer (! $ foo) {

   trigger_error (‘Değer $ foo doğru olmalı’, E_USER_NOTICE);

}

Geçiş durumu deyimlerinin düşme işlevini kullanarak belirli hata türlerinin işlenmesini nasıl gruplandırdığımızı unutmayın.

Çıktı şöyle olacaktır:

1 STRICT hatası $ foo değeri /tmp/test.php:32 konumunda doğru olmalıdır

Artık hata türlerini farklı (veya aynı) işleyebilir ve özel hata mesajı da gösterebilirsiniz. Tabii ki, gerçek bir özel hata işleme fonksiyonu hatalarla çok daha fazlasını yapabilmeli ve muhtemelen belirli ve mantıklı bir şekilde bunlara göre hareket edebilmelidir..

Rapor edilmeyeceğinden, bu işlevin içinde hiçbir hata oluşmamasını sağlamak için özel hata işleme işlevinizi basit ve sağlam tutmanız önemlidir. Daha gelişmiş hata işleme oluşturmanıza yardımcı olabilecek birkaç PHP kütüphanesi vardır.

PHP İstisnalarını Kullanma

PHP sürüm 5 hataları işlemenin başka bir yolunu tanıttı: İstisnalar.

Özel durum işleme, belirtilen bir hata durumu oluşursa çalışan bir programın normal akışını değiştirmek için kullanılır. Hata işleme işlevlerini, özel hata işleme işlevleri yazmaktan daha dil-sözdizimiyle tümleşik bir yöntemdir.

İstisnalar PHP’de İstisna sınıfı tarafından temsil edilir. İstisnalar “atma” sözdizimi kullanılarak ortaya çıkar ve “dene / yakala” sözdizimi bloğu kullanılarak yakalanabilir. Bir Eexception hatasının oluşabileceği herhangi bir kod, “try” bloğuna yerleştirilmelidir. Bu kodu, hatayı işlemek için bir “catch” bloğu izleyebilir. Atılan İstisnalar kod yığınını oluşturduğundan, kodunuzdaki diğer “yakalama” blokları tarafından da ele alınabilir.

İstisna sözdizimi şöyle görünür:

1
2
3
4
5
6
7
8
9
10
11
12

try {// try-block’ta hatalar at

 

    // bir hata oluşursa bir istisna atabiliriz

    yeni İstisna At (‘bu bir hatadır.’);

 
}

catch (İstisna $ e) {// catch bloğundaki atışları yakala

 

    // istisna nesnesiyle bir şeyler yapın, örn. mesajını göster

    echo ‘Hata mesajı:’. $ e->getMessage ();

 
}

Hangi çıktı:

1 Hata mesajı: bu bir hatadır.

Bir İstisna nesnesi atıldıktan sonra şu üye işlevlere erişebiliriz:

  • getMessage () İstisna mesajını alır
  • GetPrevious () önceki İstisnayı döndürür
  • getCode () İstisna kodunu alır
  • dosyayı al() Kural Dışı Durumun gerçekleştiği dosyayı alır
  • hat almak() İstisnanın oluştuğu satırı alır
  • getTrace () yığın izini alır
  • getTraceAsString () yığın izini dize olarak alır
  • __toString () Kural Dışı Durumun dize ile temsil edilen hali
  • __klon() İstisna klonları

İstisna yönetiminin başka bir örneği:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ file = ‘/tmp/foo.txt’;

 

Deneyin {

    // dosyanın var olup olmadığını ve yazılabilir olup olmadığını kontrol edin

    if (! dosya_exists ($ dosya) ||! is_writable ($ dosya)) {

 

        // değilse: bir istisna atın

        new Exception (‘File’. $ file. ‘bulunamadı veya yazılabilir değil.’);

 

        echo (‘kod buraya gelecek mi?’); // daha önce bir istisna atılmışsa değil

    }

}

catch (İstisna $ e) {

    echo ‘Hata mesajı:’. $ e->getMessage ();

    yanlış döndür;

}

Bu kodu önce dosyayı oluşturmadan çalıştırırsanız, şu hatayı görürsünüz:

1 Hata mesajı: /tmp/foo.txt dosyası bulunamadı veya yazılabilir değil.

İstisnalar kod yığınını şişirir, böylece farklı kod bloklarında birden fazla atma ifadesi alabilir ve yine de bunları zarifçe işleyebiliriz. Ancak atılan ancak yakalanmayan tüm İstisnalar “Yakalanmayan İstisna” mesajıyla bir E_FATAL hatası oluşturur.

Bir örnek:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ foo = 10;

 

Deneyin {

    if (is_numeric ($ foo)) {

        eğer ($ foo > 5) {

            yeni İstisna at (‘sayı çok yüksek’); // bu atılacak

        }

    }

    Başka {

        yeni Kural Dışı Durum (‘sayı türü değil’);

    }

}

catch (İstisna $ e) {

    echo ‘Hata mesajı:’. $ e->getMessage (). ‘ çizgide: ‘ . $ e->hat almak();

    // yanlış döndür;

}

“$ E” adını verdiğimizi unutmayın->İstisna atıldığında satır numarasını almak için İstisna nesnesinin getLine () üye işlevi.

Birden fazla try-throw-catch bloğu birbirinin içine yerleştirmek mümkündür. Bu, hangi İstisna hatasının kodunuzun en anlamlı olduğu noktada (temiz ve basit bir şekilde) ele alınacağını belirlemenizi sağlar. Her zaman bir “try” bloğuna atanan kodları koymayı unutmayın.

Özel İstisna İşleyicileri

Şimdiye kadar yerleşik Exception sınıfını kullanıyoruz, ancak yerleşik Exception sınıfını genişleterek kendi özel Exception işleyicimizi de yazabiliriz. Bu, yerleşik üye işlevlerini geçersiz kılmak veya yeni üye işlevleri eklemek istediğimizde kullanışlıdır. Burada birkaç derinlemesine kod örneği görebilirsiniz.

Standart Hatalar ve İstisnalar Arasındaki Fark

Standart hata işleme, PHP’deki hataları işlemenin eski yoludur. İstisna işleme yalnızca PHP 5’ten itibaren kullanılabilir ve nesne yönelimli bir programlama yapısı kullanılmasını gerektirir.

Her ikisi de yan yana kullanılabilir. Aslında atılan ancak yakalanmayan herhangi bir İstisna, sonunda “Yakalanmayan İstisna” mesajıyla bir E_FATAL hatası oluşturur.

Aşağıda gösterilen set_error_handler () işlev kodu örneğiyle, tüm standart hataları bir İstisna olarak bile ele alabiliriz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

set_error_handler (işlev ($ errno, $ errstr, $ errfile, $ errline) {

    if (error_reporting ()) {

        yeni ErrorException durumu ($ errstr, 0, $ errno, $ errfile, $ errline);

    }

});

 

Deneyin {

    // E_UYARI

    $ fh = fopen (‘mevcut olmayan dosya’, ‘r’);

}

catch (İstisna $ e) {

    echo ‘Hata mesajı:’. $ e->getMessage ();

    yanlış döndür;

}

Son söz

Ben PHP hata işleme içine bu hızlı giriş gelişiminin bu önemli bölümünü anlamak vermiştir yardımcı umuyoruz. Artık hataların nasıl görüntüleneceğini ve günlüğe kaydedileceğini ve PHP’nin bunu mümkün kıldığı çeşitli şekillerde nasıl işleyeceğini bilmelisiniz, özel bir hata işleme işleviyle veya Özel Durum işleme ile.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Adblock
    detector