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_Exception
klasę)
error
best-practice
exception
Salman von Abbas
źródło
źródło
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.Odpowiedzi:
Wezwanie
Mage::throwException
służy do zgłaszania wyjątków dla określonejMage_Core_Exception
odmiany. Są one zwykle używane do przedstawiania komunikatów o błędach użytkownikowi końcowemu. Na przykład, wykonaj szybkie wyszukiwanieMage::throwException
w 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 Exception
lub coś wnew My_Custom_Exception
tym 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::exception
ale 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.źródło
Mage::throwException('my error message')
do mojej klasy pomocniczej, ale nic się nie stało?Wykonałeś trudną część, sprawdzając, jak często są używane :)
tl; dr: IMHO, powinieneś używać
Mage::throwException
najczęściej, cofając się doMage::exception
momentu, 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 new
przed nim.Oto podział:
Mage::throwException
jest zasadniczo opakowaniemMage_Core_Exception($message)
z dodatkową funkcjonalnością polegającą na dodaniu wyjątku do sesji za pośrednictwemgetSingleton
połączenia połączonego za pomocąaddMessage
new Exception()
jest podstawowym sposobem PHP na zgłoszenie wyjątku, ale wymaga użyciathrow
słowa kluczowego i jest prawdopodobnie najmniejszym „wydajniejszym”, ponieważ pozostałe dwa są opakowaniami z dodatkową funkcjonalnością.Mage::exception
jest 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óralogException
zapewnia (np. Brak śledzenia stosu) lub chcesz wykonać wywołanie interfejsu API w wyjątku itp. Jest to również przydatne, gdy chceszthrow
wyjątek innego typu klasy, na przykład, co się dziejeMage_Paypal
, często podnoszącMage_Core
typ wyjątku.źródło
new Exception()
iMage::exception()
w najlepszym wypadku nie jest dla mnie jasne. Kiedy patrzę naMage::exception()
kod, nie widzę żadnej korzyścithrow $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.