SORU
9 Aralık 2011, Cuma


Bir alıcı birden fazla catch bloğu özel durum türleri

Tek blok AError BError yakalamak için aşağıdaki işlevselliği elde etmek için daha temiz bir yol istiyorum:

try
{
    /* something */
}
catch( AError, BError $e )
{
    handler1( $e )
}
catch( Exception $e )
{
    handler2( $e )
}

Bunu yapmak için herhangi bir yolu var mı? Ya da hepsini ayrı ayrı yakalamak zorunda mıyım?

AError Berror ortak bir temel sınıf, ama onlar da paylaşan diğer türleri isterdim sonbahar boyunca handler2, ben sadece yakalamak taban sınıf.

CEVAP
11 EKİM 2013, Cuma


Bu diğer cevaplar da dediği gibi, " AError aynı blokta BError (eğer bir istisna tanımlıyorsanız biraz daha kolaydır) yakalayabilirsiniz. Hatta "" hala sizin ihtiyaçlarınıza uygun bir hiyerarşi tanımlamak gerekir. düşmek için istediğiniz özel durumlar düşünüldüğünde

abstract class MyExceptions extends \Exception {}

abstract class LetterError extends MyExceptions {}

class AError extends LetterError {}

class BError extends LetterError {}

Sonra:

catch(LetterError $e){
    //voodoo
}

here here, SPL bile gördüğünüz gibi varsayılan istisnalar yararlanabileceğiniz bir hiyerarşi var. PHP Manual belirtildiği gibi ayrıca:

Bir özel durum, bir deyimi aşağıdaki kodu olmayacaktır idam, vePHP eşleşen ilk catch bloğu bulmaya çalışır.

Bu da mümkün olabilir

class CError extends LetterError {}

AError veya yakalamak ifadenizi şu şekilde görünecektir: BError, daha farklı şekilde ele almak gerekir

catch(CError $e){
    //voodoo
}
catch(LetterError $e){
    //voodoo
}

Eğer dava nerede vardı yirmi veya daha fazla özel durumlar meşru ait altında aynı sınıf ve işlemek için gereken beş (veya ne olursa olsun büyük-ish grubu) onları bir şekilde ve geri kalan diğer, HALA bu.

interface Group1 {}

class AError extends LetterError implements Group1 {}

class BError extends LetterError implements Group1 {}

Ve sonra:

catch (Group1 $e) {}

İstisnalar gelince OOP kullanarak çok güçlü. get_class instanceof gibi şeyler hackler ve mümkünse kaçınılmalıdır.

Eklemek istediğim başka bir çözüm özel durum işleme işlevi kendi yöntemini uyguluyor.

Olabilir

function handleExceptionMethod1(Exception $e)
{
    //voodoo
}

function handleExceptionMethod2(Exception $e)
{
    //voodoo
}

Özel Sınıf hiyerarşileri kontrol edebilirsiniz kesinlikle yolu yok farz veya arabirimleri (ve orada hemen hemen her zamanbir şekilde), aşağıdakileri yapabilirsiniz:

try
{
    stuff()
}
catch(ExceptionA $e)
{
    $this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
    $this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
    $this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
    $this->handleExceptionMethod2($e);
}

Bu şekilde, hala sadece tek bir kod yer varsa istisna işleme mekanizması değiştirmek gerekiyorsa değiştirmek zorunda, ve OOP genel yapıları içinde çalışıyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • dope2111

    dope2111

    29 HAZİRAN 2009
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007