İstisnalar: bu iyi bir uygulama mı?

7 Cevap php

Bu PHP ile yazılmış ama gerçekten agnostik bir dil.

try
{
    try
    {
        $issue = new DM_Issue($core->db->escape_string($_GET['issue']));
    }
    catch(DM_Exception $e)
    {
        throw new Error_Page($tpl, ERR_NOT_FOUND, $e->getMessage());
    }
}
catch(Error_Page $e)
{
    die($e);
}

Yuvalanmış try, catch blokları takip etmek iyi bir uygulamadır? Bu sadece bir hata sayfası için biraz hantal görünüyor - ancak bir hata oluşursa eğer benim Sorun DataManager bir özel durum atar ve ben bu hata kendısı iyi bir yol olduğunu düşünüyorum.

Error_Page istisna sadece bir hata sayfası derleyici.

Ben sadece bilgiçlik olabilir ama bu yüzden bu yazmak için iyi bir yol önermek eğer hataları bildirmek ve iyi bir yol olduğunu düşünüyor musun?

Teşekkürler

7 Cevap

Sen sayfa mantığı için İstisnalar kullanıyorsanız, ve ben şahsen bu iyi bir şey olmadığını düşünüyorum. İstisnalar kötü ya da beklenmedik şeyler olduğunda bir hata sayfasının çıkışını kontrol etmek değil, sinyal için kullanılmalıdır. Eğer İstisnalar dayalı bir hata sayfası oluşturmak istiyorsanız, set_exception_handler kullanmayı düşünebilirsiniz. Yakalanmamış istisna belirttiğiniz ne çağırma yöntemi aracılığıyla çalıştırılır. Bu bir İstisna "fatalness" durmuyor unutmayın. Bir istisna geri arama geçirildikten sonra, yürütme yakalanmamış istisna sonra normal gibi duracaktır.

Ben yuva değil daha iyi olacağını düşünüyorum. Birden fazla türde durum düşünüyorsanız, birden yakalar var.

try{
  Something();
}
catch( SpecificException se )
{blah();}
catch( AnotherException ae )
{blah();}

Istisnalar onları işleyebilir düzeyde yakalanmış olması için idealdir. Daha önce değil (zaman kaybı), ve sonra değil (Eğer bağlam kaybedersiniz).

Yani, orada bir DM_Issue oluşturmak ve ERR_SOMETHING_ELSE isteyeyim diğer yerler vardır, ya da çünkü $ tpl ve ERR_NOT_FOUND örneğin, yalnızca yeni DM_Issue çağrı yakın "bilinen" bir bilgi varsa çünkü o $ tpl değişir, size değer 'doğru yerde ilk istisnayı yakalayıp yeniden.

Nasıl ölüyor bu yerden almak için başka bir sorudur. Alternatif orada ölmek olurdu. Bunu eğer Ama sonra sonra hata ama çıkmadan önce (örneğin, bir şekilde bir şey açılıyor ya da hata sayfası değiştirme gibi) bir şey yapmak için kod müdahale için hiçbir fırsatı var. Bu açık kontrol akışını olması da iyi. Bu yüzden iyi olduğunu düşünüyorum.

Daha sonra ise muhtemelen gereksiz ayrıntılı ve sen sadece DM_Exception yakalamak fıkra ölebilirim - Ben senin örnek tam bir uygulama olmadığını varsayarak yaşıyorum. Ama gerçek bir uygulama için ben hiçbir yerde ortasında ölmek değil ilkesinin onaylıyor.

Sizin ihtiyaçlarınıza bağlı olarak bu güzel olabilir, ama genellikle, bir istisna yakalamak, yeni bir istisna mesajı sarın ve ambalajında ​​orijinal istisna yığın izleme (ve potansiyel olarak diğer) bilgi gevşek çünkü rethrow oldukça tereddüt am istisna. Eğer konum sarma istisna inceleyerek o zaman muhtemelen tamam olduğunda sure Eğer bu bilgi gerekmez.

Ben PHP ile ilgili ama mesela emin değilim Yuvalanmış try / catch-kombinasyonları için gerek yoktur bu nedenle C # Eğer birden fazla catch-Blok olabilir.

Genellikle try / catch / ile errorhandling nihayet "sadece" bir hata sayfası göstermek için de, her zaman sağduyu olduğuna inanıyoruz. Bu hataları işlemek ve çökmesini garip davranışı önlemek için temiz bir yoldur.

Bir uygulamanın geçerli bir durum var, ve sadece 404 görüntülemek için bir yığın izlemesi gerekmez - Ben bulunamadı konuda bir istisna değildir.

Ne yakalamak gerekir, beklenmedik arızaları sql hataları gibi - istisna işleme kullanışlı geldiğinde budur. Ben daha çok bu gibi bakmak kodunuzu değiştirmek istiyorsunuz:

try {
    $issue = DM_Issue::fetch($core->db->escape_string($_GET['issue']));
}
catch (SQLException $e) {
    log_error('SQL Error: DM_Issue::fetch()', $e->get_message());
}
catch (Exception $e) {
    log_error('Exception: DM_Issue::fetch()', $e->get_message());
}

if(!$issue) {
    display_error_page($tpl, ERR_NOT_FOUND);
}
else
{
    // ... do stuff with $issue object.
}

Böyle bir veritabanı sorgu düzgün yürütme veya bir şey yanlış yapılandırılmış değil gibi - bir potansiyel site kırma olayı yoktur, sadece istisnalar kullanılmalıdır. İyi bir örnek, bir önbellek veya günlük dizini Apache süreci tarafından yazılabilir olmasıdır.

Burada fikir, istisnalar dağıtımdan önce onları düzeltmek böylece tüm site zarar verebilir kodu durdurmak için, size, geliştirici için olmasıdır. Onlar hiçbir şey zarar vermeden önce çevre değişiklikleri (yani birileri önbellek klasörünün izinlerini değiştirir veya veritabanı düzenini değiştirmek) sitesi durursa emin olmak için de aklı kontroller.

Yani, hayır; yuvalanmış catch işleyicileri iyi bir fikir değildir. Benim sayfalarında, benim index.php dosyası try ... önbellek bloğunda kodunu sarar - ve kötü bir şey olursa o onun üretimde olup olmadığını görmek için denetler; ve e-postaları bana ve genel bir hata sayfası görüntülemek ya da sağ ekranda hata gösterir.

Unutmayın: PHP, C # değil. Durumunu içeren uygulamalar için - PHP vatansız bir betik dili ise: C # (p) ASP.net ve (hehe, hayır cinas amaçlanan hariç) olduğunu.