PHP istisnalar - Catch veya set_exception_handler / deneyin?

3 Cevap php

Ben php istisna sınıfın birden çok çocuk sınıflarını kullanan benim sistemde bazı alt uç kod geliştiriyorum. Esasen ben bir kaç kategoride kadar kırık istisnaları var. Ne yapmak isteyen kulüpler iki şeydir.

  1. Ben tek bir yerde ele alınması uygulamasında ateş tüm durumları gerekir.
  2. Ben oturum açın ve ardından kolu / apps hakkında geri bildirim almak için kullanıcı için görünüm oluşturmak gerekiyor. hatası.

Ben uygulamayı kapsüllenmesinde try / catch çeşit olmalıdır nedir merak ediyorum nedir? Ben de tüm bu fikrini sevmiyorum, bir çok berbat uygulanması gibi geliyor. I bir nesnenin bir yöntem olarak işlevini taşları sürece ben de set_exception_handler fikrini sevmiyorum. Bunun nedeni istisnaları işlemek için bir işlev atamak, bu uygulamada ilk fonksiyon olmasıdır. Her şey, bir nesnenin bir yöntemdir.

Umarım senaryo hakkında yeterli bilgi verdik. Bu temiz tutmak ve en iyi uygulamaları takip etmeye çalışıyorum. Bu kod OSS olacak yani ben bunu 10 kere yazma gibi hissetmiyorum :)

3 Cevap

  1. Bir Front Controller script ile web isteklerini çalıştırabilirsiniz
  2. now set_exception_handler early in that script (don't forget to account for error_reporting()). set_exception_handler bir "callback" dediği php onun Paramtre olarak alır. Bunu gibi bir nesne yöntemi iletebilirsiniz:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  3. Istisnalar atmak YAPAR herhangi bir kod yakalamak için try/catch ile sevk kodunuzu sarın. Kodunuzu yakalamak kısmı, sizin {sayesinde tüm kendi kodları 'istisnaları yakalamak, artı doğal bir durum oluşturmak vermedi some php hataları (örneğin, fopen ya da bir şey) olur [(3)]} Yukarıdaki diyoruz. Php manuel devletler:

    The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

  4. Gerektiğinde hatalarını açın.

  5. Bir İstisna nesnesi ("Model") üzerinde çalışır ve oldukça gelişme, sizin için bütün yığın izlemesini yazdıran bir hata sayfası şablonu ("View") oluşturun. Üretim gider farklı bir şablon oluşturun. Örneğin, çevre şube:

    catch(Exception $e) {
        // log error as necessary here.
        if("in developement") {
            // $e would be available to your template at this point
            include "errortemplates/dev.php";
        } else {
            include "errortemplates/prod.php";
        }
    }
    

PHP'nin "geriçağırımlarının" here hakkında daha spesifik bilgi var. Statik bir yöntem kullanmak için, geri arama gibi bir şey olduğunu

<?php
set_exception_handler(array('MyClass','staticMethod'));
?>

Bir örneği nesneden bir yöntemi kullanmak için, bu:

<?php
set_exception_handler(array($myObject, 'objectMethod'));
?>

Ve küresel bir işlevi kullanmak için, bu sadece:

<?php
set_exception_handler('my_global_function');
?>

Bu sesler yoldan, sen set_exception_handler kullanarak olacaktır. Bu, tüm istisnalar aynı şekilde ele alınır olduğunu garanti edecektir. Mutlaka aynı şekilde yakalanmış olması gerekmez, tek bir istisna kontrol etmek istiyorsanız söylemek, uygulamanızda try / catch blokları kullanmak için yer vardır.

Bildiğim kadarıyla set_exception_handler ayarı olarak, ben bu statik bir yöntem olmadığı sürece bir nesnenin bir yöntem olarak işlevini ayarlayabilirsiniz emin değilim. Bu durumda görünür. http://us2.php.net/set_exception_handler daha fazla bilgi bulunmaktadır