Magento'da istisnaları atmanın tercih edilen yolu nedir?


45

Aşağıdaki yöntemlerin tümü Magento çekirdeğinde kullanılır, bu nedenle hangisi tercih edilir (veya en son "en iyi uygulama")?

  • Mage::throwException('Some Message')- 732 Kullanımlar
  • throw new Exception('Some Message')- 419 Kullanımlar
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Kullanımlar
    (bir Vendor_Module_Exceptionsınıf oluşturmanız gerekir )

2
yürütme sayısını nasıl buldunuz? Merak etmesini merak ediyorum !!!
Rajeev K Tomy

1
@RajeevKTomy Komut satırından bir grep tahmin ediyorum grep -r throwException /path/to/magento/app/code/core | wc -l ; grep -r throw\ new /path/to/magento/app/code/core | wc -l ; grep -r throw\ Mage /path/to/magento/app/code/core | wc -l- bunun gibi bir şey - bunun için de aradığınızı bilmenizi gerektirir.
Doug McLean

Yanıtlar:


36

Çağrı Mage::throwException, belirli bir özelliğin istisnalarını atmak için kullanılır Mage_Core_Exception. Bunlar genellikle son kullanıcıya hata mesajları sunmak için kullanılır. Bunun örnekleri için Mage::throwException, Mage_Checkout modülünde hızlı bir arama yapın, sonuçta oturum nesnesine ekleneceği ve kullanıcıya görüntüleneceği için hata mesajının atılmadan önce çevrildiği birçok örnek bulacaksınız. sonuçtaki sayfa.

Kullanımı new Exceptionveya benzeri bir şey new My_Custom_Exceptionnormalde uygulamanın içindeki hataları attığınız yerde olur, büyük olasılıkla asla son kullanıcıya gösterilmemesi gereken hatalar. Belki bunları yakalar ve incelikle ele alırsınız (bazı durumlarda özel bir istisna türü için iyi bir kullanım) veya kullanıcıya daha genel bir hata mesajı geldiğinde isteği yakaladı, günlüğe kaydetti ve sonlandırdı.

Hiç kişisel olarak kullanmadım, Mage::exceptionancak her modül için benzersiz bir istisna türüne sahip bir desen oluşturma girişimi gibi görünüyor. Temelde verilen modül için bir istisna örneği döndüren bir fabrika olduğu için (bu yazının yazıldığı sırada) geçersiz kılmalar gibi şeyler için herhangi bir destek uygulamamasına rağmen, kullanımında hiçbir zararı olmazdı.


Buradaki mantığınızı beğendim - ingilizce. :)
philwinkle

Mage::throwException('my error message')Yardımcı sınıfımı aradım ama hiçbir şey olmuyor ??
Kara,

16

Ne kadar sıklıkla kullanıldığını bulmak için zor kısmı yaptınız :)

tl; dr: IMHO, Mage::throwExceptionen sık kullanmalısınız , Mage::exceptionistisna tipini modülünüzün kapsamı dışına çıkarmanız gerektiğinde, oturum mesajlaşma yeteneğinden başka bir nedenden ötürü olmasanız da kullanmamalısınız. throw newönüne yazmak zorundasın .

İşte dağılım:

  • Mage::throwExceptiontemelde, bir zincirle Mage_Core_Exception($message)bir getSingletonçağrı yoluyla istisnayı bir oturuma ekleyebilme ek işlevine sahip bir sarmalayıcıdır.addMessage
  • new Exception()bir istisna atmanın temel PHP yoludur, ancak throwanahtar sözcüğü kullanmanızı gerektirir ve diğer ikisi de ekstra işlevselliğe sahip olan sarmalayıcılar olduğundan muhtemelen en küçük en büyük "performans" tır.
  • Belirtildiği gibi, Mage::exceptionaynı zamanda bir sarıcıdır, ancak kendi istisna sınıfınızı başlatmanıza olanak sağlama avantajına sahiptir. Bir eklenti geliştiricisiyseniz ve istisnalar için özel günlükler yapmanız, ayrı olarak, sağlayan (ör. Yığın izlemeyen) işlevsellik olmadan veya istisna dışında bir API çağrısı yapmak istemeniz gerekiyorsa , bu gerçekten yararlıdırlogException . throwFarklı bir sınıf tipi istisnası yapmak istersiniz , örneğin, ne olduğu Mage_Paypal, sıklıkla bir Mage_Coreistisna tipi ortaya çıkması gibi .

Zamanlama hakkında konuşun… 10 saniyeden kısa bir süre. :)
davidalger 13:13

Tercih sebebi arasında new Exception()ve Mage::exception()en iyi şekilde benim için net değil. Mage::exception()Kod içine baktığımda , hiçbir fayda göremiyorum throw $exception, aslında sınıf adının önizlemesini yaptığınız (/ /) uzantınız için standart otomatik yüklemeyi yapılandırdığınız istisna sınıfını seçmenizi, statik analizi engeller ve doğrudan attığı istisna hakkında ek yöntemler çağırmanıza izin vermez.
hakre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.