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:
- Do odzyskania
- Nie do odzyskania.
Różnicę podsumowuję następująco:
Can I still show the page that was requested, even though this error occurred?
- Tak? - Do odzyskania
- Nie? - Nie do odzyskania
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:
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
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:
JFactory::getApplication()->enqueueMessage($error, 'error');
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:
try {
// exception generating code
throw new Exception('Normally you would have other code that calls a class that throws the exception', 500);
} catch (Exception $e) {
$msg = $e->getMessage(); // Returns "Normally you would have other code...
$code = $e->getCode(); // Returns '500';
JFactory::getApplication()->enqueueMessage($msg, 'error'); // commonly to still display that error
}
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:
// Check for errors.
if (count($errors = $this->get('Errors')))
{
throw new Exception(implode("\n", $errors), 500);
return false; // you can remove this too, technically since the exception will take you out of this function.
}