Як сказав @DmitryRekun, гарне обговорення тут . Ключовим елементом, який слід враховувати у всьому цьому, є тип помилок у вас?
Існує два типи помилок:
- Відновлюється
- Неможливий
Різницю я, як правило, підсумовую так:
Can I still show the page that was requested, even though this error occurred?
- Так? - Відновлювані
- Ні? - Невідшкодований
Тепер, коли ми знаємо, з чим маємо справу. Що тобі слід робити?
Якщо помилку неможливо усунути, ви хочете перенаправити їх на сторінку помилок, а не продовжувати переглядати потрібну сторінку . Це так просто, як наступне:
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
Exception
це клас, який приймає два параметри, повідомлення та код. Рекомендується спробувати використовувати коди відповідей HTTP, якщо вони відповідають вашому сценарію.
Якщо помилку можна виправити, ви, ймовірно, просто захочете відобразити повідомлення кінцевому користувачеві, продовжуючи показувати їм потрібну сторінку. Зазвичай це означає, що вам слід "запхнути" повідомлення для програми:
JFactory::getApplication()->enqueueMessage($error, 'error');
enqueueMessage
приймає два параметри, повідомлення про помилку та тип повідомлення. Більше інформації тут (внизу).
Є також третя ситуація, яка трапляється досить часто для мене, принаймні. Joomla викине винятки за різні помилки (наприклад, помилка запиту бази даних). Це означає, що Джомла вважає, що цю помилку не можна виправити. Однак ви можете продовжити все-таки. (Наприклад, якщо я змінюю таблицю під час оновлення свого розширення, я можу просто запустити ALTER
запит, який видасть виняток, якщо таблиця була раніше змінена.)
У такому випадку ви хочете обернути код, який може кинути виняток у розділі спробувати ... 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
}
Зауважте, що ви робите "ловити" непоправну помилку і змушувати систему відновитись і продовжувати показувати запитувану сторінку.
Додайте все це, і у вашому випадку має бути помилка, яку не можна усунути. (Я знаю це, тому що після цього у вас є "повернути помилкове", тому ви, ймовірно, не плануєте продовжувати і відмовляєтесь від функції.)
Таким чином я би переписав це так:
// 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.
}