Como o @DmitryRekun disse, uma boa discussão está aqui . A peça chave a considerar em tudo isso é que tipo de erro você possui?
Existem dois tipos de erros:
- Recuperável
- Irrecuperável.
A diferença que tendem a resumir da seguinte forma:
Can I still show the page that was requested, even though this error occurred?
- Sim? - Recuperável
- Não? - Irrecuperável
Agora que sabemos com o que estamos lidando. O que você deveria fazer?
Se o erro for irrecuperável, você deseja redirecioná-los para uma página de erro, em vez de continuar na página solicitada . Isso é tão simples quanto o seguinte:
throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
Exception
é uma classe que aceita dois parâmetros, uma mensagem e um código. É recomendável tentar usar os códigos de resposta HTTP, se eles se ajustarem ao seu cenário.
Se o erro for recuperável, você provavelmente só deseja exibir uma mensagem para o usuário final enquanto ainda mostra a página solicitada. Isso normalmente significa que você deve 'enfileirar' uma mensagem para o aplicativo:
JFactory::getApplication()->enqueueMessage($error, 'error');
enqueueMessage
usa dois parâmetros, a mensagem de erro e um tipo de mensagem. Mais informações aqui (na parte inferior).
Há também uma terceira situação que ocorre com bastante frequência para mim, pelo menos. O Joomla lançará exceções para diferentes erros (como um erro de consulta ao banco de dados). Isso significa que o Joomla acha que esse erro é irrecuperável. No entanto, convém continuar assim mesmo. (Por exemplo, se estou alterando uma tabela na atualização da minha extensão, posso apenas executar a ALTER
consulta, que emitirá uma exceção se a tabela tiver sido alterada anteriormente.)
Nesse caso, você deseja agrupar o código que pode lançar uma exceção em uma seção 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
}
Observe que o que você está fazendo é "capturar" o erro irrecuperável e forçar o sistema a se recuperar e continuar mostrando a página solicitada.
Adicione tudo isso e seu caso deve ser um erro irrecuperável. (Eu sei disso porque você 'retornou falso' depois, então você provavelmente não planeja continuar e está desistindo da função.)
Assim, eu reescreveria isso da seguinte maneira:
// 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.
}