Как сказал @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 будет генерировать исключения для разных ошибок (например, ошибка запроса к базе данных). Это означает, что Joomla считает эту ошибку невосстановимой. Тем не менее, вы можете продолжить в любом случае. (Например, если я изменяю таблицу при обновлении своего расширения, я могу просто выполнить ALTER
запрос, который выдаст исключение, если таблица была ранее изменена.)
В этом случае вы хотите обернуть код, который может вызвать исключение, в секции 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
}
Обратите внимание, что вы «ловите» неисправимую ошибку и заставляете систему восстанавливаться и продолжать показывать запрошенную страницу.
Добавьте все это, и ваш случай должен быть неисправимой ошибкой. (Я знаю это, потому что впоследствии у вас есть «return false», так что вы, вероятно, не планируете продолжать и разочаровываетесь в этой функции.)
Таким образом, я бы переписал это следующим образом:
// 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.
}