Jaki jest preferowany sposób zgłaszania wyjątków w Magento?

45

Wszystkie poniższe metody są używane w rdzeniu Magento, więc który jest preferowanym (lub najnowszym „najlepszym rozwiązaniem”) sposobem?

  • Mage::throwException('Some Message')- 732 zastosowań
  • throw new Exception('Some Message')- 419 zastosowań
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 zastosowań
    (trzeba utworzyć Vendor_Module_Exceptionklasę)
Salman von Abbas
źródło
2
jak znalazłeś liczbę egzekucji? Proszę o ciekawość, aby to wiedzieć !!!
Rajeev K Tomy
1
@RajeevKTomy Zgaduję grepa z wiersza poleceń - coś podobnego 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- choć to wymaga, abyś wiedział, czego też szukasz.
Doug McLean,

Odpowiedzi:

36

Wezwanie Mage::throwExceptionsłuży do zgłaszania wyjątków dla określonej Mage_Core_Exceptionodmiany. Są one zwykle używane do przedstawiania komunikatów o błędach użytkownikowi końcowemu. Na przykład, wykonaj szybkie wyszukiwanie Mage::throwExceptionw module Mage_Checkout, znajdziesz wiele przypadków, w których komunikat o błędzie jest faktycznie tłumaczony przed jego rzuceniem, ponieważ ostatecznie zostanie dodany do obiektu sesji i wyświetlony użytkownikowi na wynikowa strona.

Używanie new Exceptionlub coś w new My_Custom_Exceptiontym stylu zwykle powoduje rzucanie błędów wewnątrz aplikacji, błędów, które najprawdopodobniej nigdy nie powinny być wyświetlane użytkownikowi końcowemu. Być może złapiesz je i obsłużysz je z wdziękiem (w niektórych przypadkach dobre użycie niestandardowego typu wyjątku), lub innym razem kończą się one złapaniem, zalogowaniem i zakończeniem żądania, wyświetlając użytkownikowi bardziej ogólny komunikat o błędzie.

Nigdy osobiście nie korzystałem, Mage::exceptionale wydaje się, że jest to próba utworzenia unikalnego typu wyjątku dla każdego modułu. Korzystanie z niego nie zaszkodzi, ponieważ jest to w zasadzie fabryka, która zwraca instancję wyjątku dla danego modułu, chociaż (w momencie pisania tego tekstu) nie implementuje żadnej obsługi takich rzeczy jak przesłonięcia.

davidalger
źródło
Podoba mi się tutaj twoje rozumowanie - to jest po prostu angielski :)
philwinkle
Zadzwoniłem Mage::throwException('my error message')do mojej klasy pomocniczej, ale nic się nie stało?
Czarny
16

Wykonałeś trudną część, sprawdzając, jak często są używane :)

tl; dr: IMHO, powinieneś używać Mage::throwExceptionnajczęściej, cofając się do Mage::exceptionmomentu, gdy musisz zgłosić typ wyjątku spoza zakresu modułu, jeśli nie z innego powodu niż możliwość wysyłania wiadomości sesyjnych i fakt, że nie muszę wpisać throw newprzed nim.

Oto podział:

  • Mage::throwExceptionjest zasadniczo opakowaniem Mage_Core_Exception($message)z dodatkową funkcjonalnością polegającą na dodaniu wyjątku do sesji za pośrednictwem getSingletonpołączenia połączonego za pomocąaddMessage
  • new Exception()jest podstawowym sposobem PHP na zgłoszenie wyjątku, ale wymaga użycia throwsłowa kluczowego i jest prawdopodobnie najmniejszym „wydajniejszym”, ponieważ pozostałe dwa są opakowaniami z dodatkową funkcjonalnością.
  • Jak wspomniano, Mage::exceptionjest również opakowaniem, ale ma tę zaletę, że umożliwia utworzenie własnej klasy wyjątków. Jest to bardzo przydatne, jeśli jesteś programistą wtyczek i potrzebujesz osobno tworzyć niestandardowe dzienniki dla wyjątków, bez funkcji, która logExceptionzapewnia (np. Brak śledzenia stosu) lub chcesz wykonać wywołanie interfejsu API w wyjątku itp. Jest to również przydatne, gdy chcesz throwwyjątek innego typu klasy, na przykład, co się dzieje Mage_Paypal, często podnosząc Mage_Coretyp wyjątku.
philwinkle
źródło
Porozmawiaj o czasie… w odstępie krótszym niż 10 sekund. :)
davidalger,
Uzasadnienie preferencji pomiędzy new Exception()i Mage::exception()w najlepszym wypadku nie jest dla mnie jasne. Kiedy patrzę na Mage::exception()kod, nie widzę żadnej korzyści throw $exception, to faktycznie przeszkadza ci wybrać klasę wyjątków, dla której skonfigurowałeś standardowe automatyczne ładowanie w rozszerzeniu (twoim / an), ponieważ poprzedza nazwę klasy, utrudnia analizę statyczną i nie pozwala na wywoływanie dodatkowych metod na wyjątku, który rzuca bezpośrednio.
hakre