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ę)

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.


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.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.