Qual é a maneira preferida de lançar exceções no Magento?

45

Todos os métodos a seguir são usados ​​no núcleo do Magento. Qual é o caminho preferido (ou a mais recente "melhor prática")?

  • Mage::throwException('Some Message')- 732 Usos
  • throw new Exception('Some Message')- 419 Usos
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 usos
    (necessário criar uma Vendor_Module_Exceptionclasse)
Salman von Abbas
fonte
2
como você achou a contagem de execuções? Estou pedindo curiosidade para conhecê-lo !!!
precisa
1
@RajeevKTomy Estou supondo um grep na linha de comando - algo como grep -r throwException /path/to/magento/app/code/core | wc -l ; grep -r throw\ new /path/to/magento/app/code/core | wc -l ; grep -r throw\ Mage /path/to/magento/app/code/core | wc -l- embora isso exija que você saiba o que procurar.
Doug McLean

Respostas:

36

A chamada Mage::throwExceptioné usada para lançar exceções da Mage_Core_Exceptionvariedade específica . Eles geralmente são usados ​​para apresentar mensagens de erro ao usuário final. Para obter exemplos disso, faça uma pesquisa rápida Mage::throwExceptionno módulo Mage_Checkout; você encontrará muitas instâncias em que a mensagem de erro está sendo traduzida antes de ser lançada, pois será adicionada ao objeto da sessão e exibida ao usuário em a página resultante.

Normalmente, usar new Exceptionou algo parecido new My_Custom_Exceptioné o local onde você está lançando erros internos ao aplicativo, erros que provavelmente nunca devem ser exibidos ao usuário final. Talvez você os pegue e os manipule normalmente (bom uso para um tipo de exceção personalizado em alguns casos) ou outras vezes eles acabam sendo capturados, registrados e encerram a solicitação com uma mensagem de erro mais genérica sendo exibida ao usuário.

Eu nunca usei pessoalmente, Mage::exceptionmas parece ser uma tentativa de padronizar um tipo de exceção exclusivo para cada módulo. Não haveria mal em usá-lo, pois é essencialmente uma fábrica que retorna uma instância de exceção para o módulo fornecido, embora (no momento da redação deste artigo) não implemente nenhum suporte para itens como substituições.

davidalger
fonte
Eu gosto do seu raciocínio aqui - é na planície Inglês :)
philwinkle
Liguei Mage::throwException('my error message')na minha classe auxiliar, mas nada acontece?
Preto
16

Você fez a parte mais difícil, descobrindo com que frequência eles são usados ​​:)

tl; dr: IMHO, você deve usar com Mage::throwExceptionmais frequência, voltando ao Mage::exceptionmomento em que precisa gerar um tipo de exceção fora do escopo do seu módulo, se por nenhum outro motivo, além da capacidade de mensagens da sessão e do fato de não tem que digitar throw newna frente dele.

Aqui está o detalhamento:

  • Mage::throwExceptioné essencialmente um invólucro Mage_Core_Exception($message)com a funcionalidade adicional de poder adicionar a exceção a uma sessão por meio de uma getSingletonchamada encadeada comaddMessage
  • new Exception()é a principal maneira do PHP de lançar uma exceção, mas requer que você use a throwpalavra - chave e provavelmente é o menor e mais "bom desempenho", pois os outros dois são invólucros com funcionalidade extra.
  • Como mencionado, também Mage::exceptioné um invólucro, mas tem o benefício de permitir instanciar sua própria classe de exceção. Isso é realmente útil se você é desenvolvedor de plug-ins e precisa criar logs personalizados para exceções, separadamente, sem a funcionalidade que logExceptionfornece (por exemplo, sem pilha trac) ou desejar fazer uma chamada de API por exceção, etc. Também é útil quando você deseja throwuma exceção de um tipo de classe diferente, por exemplo, o que acontece Mage_Paypal, frequentemente criando um Mage_Coretipo de exceção.
philwinkle
fonte
Fale sobre o tempo ... com menos de 10 segundos de diferença. :)
davidalger
O raciocínio da preferência entre new Exception()e Mage::exception()não está claro para mim, na melhor das hipóteses. Quando olho para o Mage::exception()código, não vejo nenhum benefício throw $exception, na verdade, dificulta a escolha da classe de exceção para a qual você configurou o carregamento automático padrão na extensão (your / an), uma vez que prefixa o nome da classe, dificulta a análise estática e não permite que você chame métodos adicionais na exceção que lança diretamente.
hakre