Size en alışılmadık bir hata kontrolü tartışması vermek niyetindeyim.
Yıllar önce bir dile çok iyi bir hata işleyici oluşturdum ve bazı isimler değişmiş olsa da, hata işleme prensipleri bugün aynıdır. Özel olarak oluşturulmuş çok görevli bir işletim sistemim vardı ve bellek sızıntısı, yığın büyümesi veya çökme olmadan her düzeyde veri hatalarını kurtarabilmeliydim. Bundan sonra, hataların ve istisnaların nasıl işlemesi gerektiği ve nasıl farklı oldukları konusundaki anlayışım var. Sadece, try catch'in iç kısımlarının nasıl çalıştığını anlamadığımı söyleyeceğim, bu yüzden bir ölçüde tahmin ediyorum.
Hata işleme kapakları altında gerçekleşen ilk şey, bir program durumundan diğerine atlamaktır. Bu nasıl yapılır? Ben buna ulaşacağım.
Tarihsel olarak, hatalar daha eski ve daha basittir ve istisnalar daha yeni ve biraz daha karmaşık ve yeteneklidir. Hatalar, onları şişirmeniz gerekene kadar iyi sonuç verir, bu da zor bir sorunu amirinize teslim etmeye eşdeğerdir.
Hatalar, hata numaraları gibi sayılar olabilir ve bazen bir veya daha fazla ilişkili dizeyle birlikte olabilir. Örneğin, bir dosya okuma hatası meydana gelirse, bunun ne olduğunu bildirebilir ve muhtemelen nazikçe başarısız olabilirsiniz. (Hay, eski günlerdeki gibi çökmekten bir adım ötede.)
İstisnalar hakkında sık sık söylenmeyen şey, istisnaların özel bir istisna yığını üzerinde katmanlı nesneler olduğudur. Bu, program akışı için bir dönüş yığını gibidir, ancak yalnızca hata denemeleri ve yakalamalar için bir dönüş durumu tutar. (Onlara ePush ve ePop derdim ve? Abort, ePop ve bu seviyeye kadar iyileşme sağlayan koşullu bir atıştı;
Yığının en altında, ilk arayan hakkında bilgi bulunur, dış denemenin ne zaman başlatıldığını bilen nesne, ki bu genellikle programınızın başlatıldığı zamandır. Üstüne üstlük ya da yığındaki bir sonraki katman, yukarı çocuklar ve aşağı ebeveynler olmak üzere, bir sonraki iç deneme / yakalama bloğunun istisna nesnesidir.
Bir deneyin içinde bir denerseniz, iç denemeyi dış denemenin üstüne yığmış olursunuz. İç denemede bir hata oluştuğunda ve ya iç yakalama bunu kaldıramazsa ya da hata dış denemeye atılırsa, kontrol, hatayı işleyip işlemediğini görmek için dış yakalama bloğuna (nesne) geçirilir, yani süpervizörünüz.
Bu hata yığınının gerçekten yaptığı şey, program akışını ve sistem durumunu işaretleyip geri yükleyebilmektir, başka bir deyişle, bir programın dönüş yığınını çökertmemesine ve işler ters gittiğinde başkaları için (veriler) işleri karıştırmamasına izin verir. Dolayısıyla, bellek ayırma havuzları gibi diğer kaynakların durumunu da kaydeder ve böylece yakalama işlemi tamamlandığında bunları temizleyebilir. Genel olarak bu çok karmaşık bir şey olabilir ve bu nedenle istisna işleme genellikle yavaştır. Genel olarak, bu istisna bloklarına epeyce durum girmelidir.
Yani bir dene / yakala bloğu, her şey karışırsa geri dönülebilecek bir durumu ayarlar. Bir ebeveyn gibi. Hayatlarımız altüst olduğunda, ebeveynimizin kucağına geri dönebiliriz ve onlar da her şeyi düzeltecek.
Umarım seni hayal kırıklığına uğratmamışımdır.
Errors are generally unrecoverable
<- aslında, bu gerçekten doğru değil.E_ERROR
veE_PARSE
en yaygın iki kurtarılamaz hatadır (birkaç tane daha vardır), ancak dev'de göreceğiniz hataların büyük çoğunluğu kurtarılabilir (E_NOTICE
,E_WARNING
ve diğerleri). Ne yazık ki PHP'nin hata yönetimi tam bir karmaşa - her türlü şey hataları gereksiz yere tetikler (örneğin, dosya sistemi işlevlerinin büyük çoğunluğu). Genel olarak istisnalar "OOP yöntemi" dir, ancak ne yazık ki PHP'nin yerel OOP API'lerinden bazıları istisnalar yerine hatalar kullanır :-(