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 Usosthrow new Exception('Some Message')
- 419 Usosthrow Mage::exception('Vendor_Module', 'Some Message')
- 94 usos
(necessário criar umaVendor_Module_Exception
classe)
error
best-practice
exception
Salman von Abbas
fonte
fonte
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.Respostas:
A chamada
Mage::throwException
é usada para lançar exceções daMage_Core_Exception
variedade 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ápidaMage::throwException
no 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 Exception
ou algo parecidonew 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::exception
mas 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.fonte
Mage::throwException('my error message')
na minha classe auxiliar, mas nada acontece?Você fez a parte mais difícil, descobrindo com que frequência eles são usados :)
tl; dr: IMHO, você deve usar com
Mage::throwException
mais frequência, voltando aoMage::exception
momento 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 digitarthrow new
na frente dele.Aqui está o detalhamento:
Mage::throwException
é essencialmente um invólucroMage_Core_Exception($message)
com a funcionalidade adicional de poder adicionar a exceção a uma sessão por meio de umagetSingleton
chamada encadeada comaddMessage
new Exception()
é a principal maneira do PHP de lançar uma exceção, mas requer que você use athrow
palavra - chave e provavelmente é o menor e mais "bom desempenho", pois os outros dois são invólucros com funcionalidade extra.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 quelogException
fornece (por exemplo, sem pilha trac) ou desejar fazer uma chamada de API por exceção, etc. Também é útil quando você desejathrow
uma exceção de um tipo de classe diferente, por exemplo, o que aconteceMage_Paypal
, frequentemente criando umMage_Core
tipo de exceção.fonte
new Exception()
eMage::exception()
não está claro para mim, na melhor das hipóteses. Quando olho para oMage::exception()
código, não vejo nenhum benefíciothrow $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.