Hataları gerçekten daha kullanışlı PHP istisnalar vardır?

4 Cevap php

(Hata veya istisnalar olarak) hataları (başarısız bir sorgu neden aşağı gidiyor DB / memcached sunucu hariç) mümkün olmamalıdır - Ben düzgün kodlu sistemlerde inanıyoruz. Bizim kodun düzgün çalışması için herhangi bir varsayım güvenmemelisiniz ve mümkün olduğunca bullet proof gibi olmalıdır.

Ancak, bizim sistemlerinin en kullanıcı dostu bir şekilde sorunları ele sigortalamak için, biz bir şey hiç yanlış, bizim sunucu personel ve son kullanıcıya hem de gitmeli, sigortalamak için "yakalama sistemi" bir tür oluşturmak ve uygulamak zorunda olacak halledilir.

Hataları ve istisnalar - Bu amaçla PHP iki çözüm sunuyor. İstisnalar bir nesneye sarılmış 5 değerlerden oluşur ise Hatalar 5 değerlerden oluşmaktadır. Hem app inşa edilirken paha biçilmezdir Backtracks sağlar.

The 5 values are $error_code, $error_message, $file, $line, $context

Normalde bizim doğru OOP programlama için çabalayan varsayılan seçim nesneleri takip etmek her zaman - ama böyle bir durumda ben gerçekten ne kadar yararlı olarak emin değilim. Istisnaları kullanılarak, ilave bellek (bu da genellikle istisna sınıflarını içeren ek dosyalar gerektirir) bir nesne değerleri sarma ihtiyacı için ne israf edilmektedir. Dahası, size bir try / catch {} bloğunda başarısız olabilir varsayalım herhangi bir kod sarmak gerekir. Bu başarısızlık noktaları geliştirici kapsamında olmayabilir gibi insan hatası açık hata işleme yöntemini bırakır. Bu karşı güvenli koruma için size yakalanmış hiçbir istisna geçilecek set_exception_handler kullanabilirsiniz. Istisna işleyicisi hakkında kötü bir şey exception_handler denir bundan sonra Yürütme duracak olan - yani bir kurtarılabilir / göz ardı istisna olarak, bir try / catch bloğunda yakalanan olmamalıdır böyle bir şey yoktur.

Öte yandan, hataları her zaman geneldir ve set_error_handler tarafından belirlenen herhangi bir fonksiyon / sınıf tarafından ele alınabilir. Bu ekstra istisna sınıfları, nesne bellek veya try / catch kod hatları için gereksinimini ortadan kaldırır. Istisnalar gibi, hataları da (istisnalar aksine) Eğer küçük veya önemsiz komut sorunları için komut dosyası yürütülmesine devam etmek için kullanabileceğiniz hata kodları inşa ile gelir. Eğer dilin akışına karşı olacak değil bu yüzden ek olarak, PHP fonksiyonları en hataları tetikler.

Yani (PHP dili yapmak) zaten hata işleme desteklemesi gerektiğini verilen, ekstra kod ve bellek ayrıca istisna uygulanması israf amacı nedir? O nesne şeklinde bir hata veya normal hataları bizi göze kalmamasıdır uygulama tasarımı gerçek bir yararı yoktur çünkü biz sadece körü körüne yapıyoruz?

4 Cevap

Ben errors tanımları ve exceptions arasında bir felsefi fark olduğuna inanıyorum.

Bir error basitçe kod mantıksal bir safsata tarafından oluşturulan programlanmış bir kusur vardır. Strlen Passing () argüman yanlış bir numara doğal bir hata olmalıdır. Bir exception, diğer taraftan, her şeyi doğru programlanmış bu davalara bakıyor, ancak kod kod temeli dış kaynaklar ile etkileşim (dosya sistemi, web hizmeti, dış çalıştırılabilir, vb.) Bu tür dış kaynakların her çağrıda mükemmel çalışması gerektiğini beklenirken, vaka olacak - Programınızın kontrol kapsamı dışında - (dosya sistemi, vb ayrılınca, bağlantı zaman aşımı olur) kodunuzu faylarla atfedilen olmadığını . Bu sorunlar dış etkenlerden dolayı olduğundan, bunlar istisna sayılır.

Temel fark, bir istisna bir üçüncü taraf kaynak bulunan bir anomali durumunda ortaya oysa bir hata, kişinin kendi kodu içinde gerçekleşmesidir.

Ben bu satırdan sonra okumayı bıraktım:

I believe that in properly coded systems - errors (as errors or exceptions) should not be possible (with the exception of a DB/memcached server going down causing a query to fail).

exceptional circumstances kod yönetmek için bir yapı olarak - bu entire purpose istisna değildir.

Eğer un olağanüstü sıradan program akışının bir parçası olarak özel durumlar atma iseniz, yanlış bir şey yapıyoruz.

Istisnalar istisnai durumlar için yararlıdır neden bilmiyorsanız, o zaman belki de gerçek bir OO dil ile bazı zaman harcamak gerekir. (İpucu: PHP gerçek bir OO dil değildir.)

Tüm bu hataların nesne yönelimli yaklaşım ile birlikte uzanan istisnaların büyük avantajlar geliyor.

Böylece bir catch bloğu (FileNotFoundException, FileNotWritableException, ...), ve yine bu istisna olabilir başka bir, diğer tüm istisnalar içinde, diyelim tüm alt durumları, IOExceptions yakalamak mümkün:

try
{
    // [...] (some code causing the exception)
}
catch(IOException $e)
{
    // do your processing here, like let's say set correct filemodes.
}
catch(Exception $e)
{
    // catches all other exceptions
}

Ayrıca onlar size komut hataları işlemek nasıl bir daha standart bir yol sunar. Try / catch bloklarını kullandığınızda, hata işleme hemen hemen her zaman benzer ve birçok durumda daha kendini açıklayıcı kodları vs ile normal hataları kullanarak daha olacak

Hangisi daha iyi anlayabiliriz:?

switch($errorCode)
{
    case 1450:
        // Create the database column
        break;
}

// or

catch(ColumnNotFoundException $e)
{
    // Create the database column
}

Bu fonksiyon fopen(), aşağıdaki geri dönme olasılığını var

If the open fails, an error of level E_WARNING is generated. You may use @ to suppress this warning.

Sen bastırma operatörü kullanmayı tercih edebilir, ama havai kendisi adil bir miktarda üretiyor. düzenli bir biçimde yürütülmesi, kullanıcılara ekran özel hataları, ve tek bir hamlede hata oturum ile devam catch blokları yakalamak hem bu hatayı olanak / deneyin. Benim için benim belgelerde özel durum işleme kullanan faydaları gibi bir hayır beyin.

Eğer (Google API sınıfların herhangi dahil) Zend Framework herhangi bir parça kullanıyorsanız Ayrıca, onlar yapmak ve oluşacak gibi kendi özel durumları işleme bekleniyor.