2012-01-28 20 views
5

Php'ye yeni geliyorum ve bir yöntemden arayan kişiye hata nesnesi iletişimi olmadığı görülüyor. Sadece anlatmak için YANLIŞ dönebilirsinizPHP'de hatalı nesneler hata nesnesi mi döndürüyor?

  1. bir yöntem gerektiği hata değil bilgi arayan sadece bir hata, bir tetiklerse bu onu E_USER_ERROR değilse:

    Bu iki ı kullanmayı öğrenmek yollardır Arayan bir şeyler ters gitti. Diğer Yolda

  2. bir yöntem bir istisna yükseltilmelidir arayana bazı hata bilgisi geri göndermesi gerekir eğer.

COCOA'dan Gelme Olağandışı koşullardaki istisnaları kullanmayı öğreniyorum (programcı hatalarından dolayı kurtarılamaz hatalar). Başka bir durumda, sadece bir hata nesnesini arayan kişiye iletmeniz yeterlidir.

  • PHP'de philosify farklı mıdır?
  • istisnalar arayana hata verilerini geri göndermek standar mekanizması mı?
  • Ben kendi hata nesneleri programlama önlemek ve yönteme dışarı param PHP desenleri ile tutarlı olması için daha sonra geçerlerse? gerçekten iyi bir yolu yoktur bu yüzden
+2

Bunu tersine çevireceğim ve "Bir istisnayı yükseltmek yerine bir hata nesnesi döndürmek ne zaman tercih edilir?" Diye soruyorum. –

cevap

8

PHP belirten ve program akışı hataların giderilmesine yönelik iki ana mekanizma vardır:

Kişisel tercihinize göre seçim yapabilirsiniz. İstisnalar nesnelerdir, yani OOP yapmak veya İstisnalar da kullanan başka bir dilden gelmek istiyorsanız, bunları kullanmak isteyebilirsiniz. İstisna dayalı olmayan hata işleme, PHP'nin yayınlayabileceği tüm Uyarıların, Uyarıların ve Hataların yanı sıra bunların varyantlarına sahip olmanızdır. Bunları İstisnalar'a dönüştürmek isterseniz, ErrorException'a bakın. Zaten bahsedildiği gibi

Ancak: istisnalar kurtarılamaz durumlar içindir. Düzenli kontrol akışını yönetmek için değillerdir. Sonuç olarak, İstisnalar, hata mesajlarını bir arayana geri göndermek için bir çeşit standart mekanizma değildir, örn. Yapmanız gereken:

class FooValidator 
{ 
    public function isValid($valueToValidate) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     throw new ValidationException('Foo didnt satisfy rule Bar'); 
    } 
} 

ve/catch deneyin arayan o. Başarısız bir doğrulama, kurtarılabilir bir durumdur.

Seçeneklerden biri bir Notification Object tanıtmak olacaktır: Yukarıdaki örnekte

class FooValidator 
{ 
    public function isValid($valueToValidate, Notification $notification) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     $notification->addMessage('Foo didnt satisfy rule Bar'); 
     return false; 
    } 
} 

, Validator sadece bir Boole döndürür ama doğrulama geçti Bildirim nesnede neden başarısız ilgili ek bilgiler toplayabilir.Bu, geri dönüş türünü kontrol etmemiz gerekmediğinden, aramadan bir Hata Nesnesi döndürmekten çok daha temizdir. Doğrulama yanlış döndürürse, Bildirim nesnesini kontrol edebileceğimizi biliyoruz. Nesneler referans yoluyla iletildiğinden, nesneyi aramadan geri göndermemiz gerekmez, ancak arayanlardan gelen mesajlara erişmeniz yeterli olmaz.

+0

Bu cevabı beğeniyorum, ancak akış denetimi için istisnalar kullanmamanız gerektiği argümanıyla ikna olmadım. Neden olmasın? İstisnaların yayılması, bir seviyedeki bir dış fonksiyonun bir hatadan en uygun şekilde kurtarılmasına izin vermiyor mu? Hemen her zaman bir varsayılan değer döndürerek beklemediğimiz bir şeyden "geri kazanabiliriz", ancak o dönüş değerinin geçerli bir aramanın sonucu olup olmadığının değerlendirilmesinin mantığı, arayan kişiye bırakılır. Bir istisna, bir şeyin yanlış olduğunu ve en uygun işleyiciye doğru yayıldığını açıkça gösterir. Lütfen beni –

+1

@ me232 konusunda eğitin İstisna bir istisna oluştuğunu gösterir (sadece yanlış bir şey değil). Başarısız bir doğrulama (yukarıdaki örnekte olduğu gibi) istisna değildir. Bunu istisna işleme süreci boyunca çalıştırmak için hiçbir neden yoktur. Ayrıca bkz. Http://www.c2.com/cgi/wiki?DontUseExceptionsForFlowControl ve http://schlitt.info/opensource/blog/0724_python_good_bad_evil_03_flow_control_exceptions.html – Gordon

+0

Örneğinize katılıyorum, istisna kullanımı oldukça anlamsızdır. false değeri zaten yeterlidir. Fonksiyon problemin kendisinden kurtarabiliyor gibi görünüyor. Bir nesneyi diğerine dönüştürmenin daha karmaşık bir örneğinizin olduğunu varsayalım. Bağımsız değişken dönüşüm için uygun değilse bir istisna atmak yanlış mıdır? Tüm potansiyel arayanlar bazı doğrulama mantığı uyguluyor mu? –

0

hemen her şeyi PHP mümkündür.

php.net üzerinde İstisnalar bakmak http://php.net/manual/en/language.exceptions.php

+5

Her dil için hemen hemen her şeyin mümkün olduğunu acımasızca öğreniyorum. Bu nedenle tasarım kalıpları bizi daha kolay hale getiriyor, bizden tekerlekleri yeniden icat etmemizi ve başkalarının deneyimlerini öğrenmemizi engelliyor. Resmi belgeler asla hata nesnelerinden bahsetmiyor, bu yüzden soruyorum. –

İlgili konular