PHP Hata işleme: die () Vs trigger_error () Vs throw İstisna


119

PHP'de Hata işleme ile ilgili olarak - Bildiğim kadarıyla 3 stil vardır:

  1. die()veya exit()stil:

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
  2. throw Exception stili:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
  3. trigger_error() stili:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }

Şimdi, PHP kılavuzunda üç yöntem de kullanılmaktadır.

  • Bilmek istediğim, hangi stili tercih etmeliyim ve neden?

  • Bu 3 damla birbirinin yerine mi geçiyor ve bu nedenle birbirinin yerine kullanılabilir mi?

Biraz OT: Sadece ben mi yoksa herkes PHP hata işleme seçeneklerinin php geliştiricilerinin kafasını karıştıracak kadar çok olduğunu mu düşünüyor?


4
Bunlar "stiller" değil. Farklı dil özellikleridir. Farklı amaçlar için.
mario

11
@mario: farklı girintili amaç nedir? Lütfen beni aydınlat :)
CuriousMind

Soruyu harika bir şekilde soruyorsunuz. sorduğun için teşekkürler
Muhasebeci م

Yanıtlar:


86

İlki, son kullanıcılarla ilgisi olmayan bilgileri taşıdığı için asla üretim kodunda kullanılmamalıdır (kullanıcı "Veritabanına bağlanılamıyor" konusunda hiçbir şey yapamaz ).

Belirli bir kritik kod noktasında uygulamanızın başarısız olabileceğini biliyorsanız ve kodunuzun birden çok çağrı düzeyinde kurtarılmasını istiyorsanız İstisnalar atarsınız .

trigger_error()(farklı hata mesajlarını kullanarak) ayrıntılı hata raporlamalarına izin verir ve bu hataları son kullanıcılardan gizleyebilir (kullanarak set_error_handler()) ancak yine de test sırasında size gösterilmesini sağlayabilirsiniz.

Ayrıca trigger_error(), geliştirme sırasında önemli olan ve özel bir hata işleyici kullanılarak üretim kodunda bastırılabilen ölümcül olmayan mesajlar üretebilir. Önemli hatalar da üretebilirsiniz ( E_USER_ERROR) ancak bunlar kurtarılamaz. Bunlardan birini tetiklerseniz, programın yürütülmesi bu noktada durur . Bu nedenle, önemli hatalar için İstisnalar kullanılmalıdır. Bu şekilde, programınızın akışı üzerinde daha fazla kontrole sahip olursunuz:

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

Burada, gather_data()sadece düzensiz ( E_USER_ERRORveya kullanarak die()) bir şans varsa, önceki INSERTifadeler, istenmese bile veritabanınıza girmiş olur ve bundan sonra ne olacağı konusunda hiçbir kontrolünüz olmaz.


2
bu yüzden trigger_error()istisnalar dışında: hangisini ve ne zaman kullanmalıyım?
CuriousMind

@Gaurish Bunun üzerine eklenen örneğe bakın.
Linus Kleen

2
Örneğinizi okuduktan sonra, istisna atmanın ardındaki amacı artık daha iyi anladığımı düşünüyorum. Teşekkürler :)
CuriousMind

1
@Pacerier Bu aslında sunucunun konfigürasyonuna bağlıdır. Bir sistem olabilir yapılandırılabilir özdevinimli dolayısıyla açık, varsayılan başına ROLLBACK. Bu sözde kod örneği her iki durumu da kapsar: autocommit için yapılandırılmamış sunucular ( COMMITifade gereklidir) ve bunu yapanlar.
Linus Kleen

1
@LinusKleen, hattı çalıştırdığımızda autocommit kapatılmadı query('START TRANSACTION');mı?
Pacerier

10

Genellikle geliştirme kodunda basit hata ayıklama için ilk yolu kullanırım. Üretim için tavsiye edilmez. En iyi yol, programın diğer bölümlerinde yakalayabileceğiniz ve bazı hata işlemlerini yapabileceğiniz bir istisna atmaktır.

Üç stil, birbirinin yerine geçme yöntemi değildir. İlki hiç bir hata değil, sadece komut dosyasını durdurmanın ve manuel olarak ayrıştırmanız için bazı hata ayıklama bilgilerini vermenin bir yoludur. İkincisi kendi başına bir hata değildir, ancak onu yakalayamazsanız bir hataya dönüştürülecektir. Sonuncusu, PHP motorunda, PHP ortamınızın yapılandırmasına göre ele alınacak gerçek bir hatayı tetiklemektir (bazı durumlarda kullanıcıya gösterilir, diğer durumlarda sadece bir dosyaya giriş yapmış veya hiç kaydedilmemiştir).


1
İstisna atıldığında ancak yakalanmadığında ne olur? ölümcül bir hataya neden olur sanırım. Ve trigger_error()aynı şey olur. öyleyse fark nedir?
CuriousMind

4
Aradaki fark, istisnayı yakalayıp istediğiniz şekilde halledebilmenizdir.
Emil Vikström
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.