W jądrze Joomla wciąż znajduję wiele takich połączeń:
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode("\n", $errors));
return false;
}
Jednak JError jest przestarzały od wydania platformy 12.1. Jak powinienem używać standardowych wyjątków PHP.
php
error-handling
jerror
Harald Leithner
źródło
źródło
Odpowiedzi:
Jak powiedział @DmitryRekun, dobra dyskusja jest tutaj . Kluczową kwestią do rozważenia w tym wszystkim jest to, jaki rodzaj błędu masz?
Istnieją dwa rodzaje błędów:
Różnicę podsumowuję następująco:
Teraz, gdy wiemy, z czym mamy do czynienia. Co powinieneś zrobić?
Jeśli błędu nie można naprawić, należy przekierować go na stronę błędu zamiast kontynuować na żądanej stronie . Jest to tak proste, jak następujące:
Exception
to klasa, która przyjmuje dwa parametry, komunikat i kod. Zaleca się, aby spróbować użyć kodów odpowiedzi HTTP, jeśli pasują one do Twojego scenariusza.Jeśli błąd można naprawić, prawdopodobnie po prostu chcesz wyświetlić komunikat użytkownikowi końcowemu, wciąż pokazując mu żądaną stronę. Zazwyczaj oznacza to, że należy „kolejkować” komunikat dla aplikacji:
enqueueMessage
przyjmuje dwa parametry, komunikat o błędzie i typ komunikatu. Więcej informacji tutaj (na dole).Jest też trzecia sytuacja, która przynajmniej dla mnie zdarza się dość często. Joomla zgłosi wyjątki dla różnych błędów (takich jak błąd zapytania do bazy danych). Oznacza to, że Joomla uważa, że tego błędu nie da się naprawić. Mimo to możesz kontynuować. (Na przykład, jeśli zmieniam tabelę po aktualizacji mojego rozszerzenia, mogę po prostu uruchomić
ALTER
zapytanie, które spowoduje wyjątek, jeśli tabela została wcześniej zmieniona).W takim przypadku chcesz owinąć kod, który może zgłosić wyjątek w sekcji try ... catch:
Pamiętaj, że to, co robisz, polega na „wychwyceniu” nieodwracalnego błędu i zmuszeniu systemu do odzyskania i kontynuowania wyświetlania żądanej strony.
Dodaj to wszystko, a twoja sprawa powinna być nieodwracalnym błędem. (Wiem o tym, ponieważ potem „zwracasz fałsz”, więc prawdopodobnie nie planujesz kontynuować i rezygnujesz z funkcji).
Dlatego przepisałbym to w następujący sposób:
źródło
$this->get('Errors')
ponieważ jest on również przestarzały.JDEBUG
jesttrue
.Oto jak zarządzam błędami.
Widok lub kontroler
Więc jeśli otrzymam kod 404 z mojego modelu (na przykład):
Następnie łapię to w widoku lub kontrolerze i rzucam jeszcze jeden wyjątek, który Joomla obsłuży i wyświetli stronę 404. W przypadku każdego innego po prostu pokazuję użytkownikowi ogólny komunikat o błędzie.
Przeczytaj także tę interesującą dyskusję na temat obsługi błędów.
źródło
Większość takich bloków kodu można po prostu zastąpić,
enqueueMessage
ponieważ tak naprawdę nie działają one na błąd i po prostuJError
drukują je.źródło