A curiosity-driven developer, mobile enthusiast, blogger and live coder. I like to build solid and scalable products with great user experience and share my knowledge with the community.
Eu entendi a ideia, ela parece que deixa as coisas mais claras, porém isso aumenta o número de códigos que vão tratar as exceptions, isso pode gerar um montão de código que você vai precisar dar manutenção quando as regras mudarem.
Eu faço diferente, crio um repositório de mensagens exceptions (ou Resources) e depois uso as referência para dispará-las de dentro dos objetos de negócios, sem mais código envolvido, já que são os objetos de negócios que sabem o que deu errado e eles devem entregar as informações para as camadas superiores de uma forma padrão. A simplicidade às vezes é melhor do que mais código envolvido e mais acoplamentos entre classes ou mais funções.
Talvez sua ideia seja mais aplicável a aplicações onde determinar o que está ocorrendo dentro de uma regra de negócio é complexo e você queira isolar tais regras.
Excelente post amigo!! Se me permite um pitaco... Um tempo atrás li sobre o uso abusivo de try catch em desfavor ao uso de lógica com base em condicionais e o resultado é que blocos try catch tornam seu código lento (e caro) e, por este motivo, é desencorajado o uso excessivo salvo guardo ocasiões em que não se sabe qual tratativa realizar (casos desconhecidos pela sua lógica). Deixo aqui dois links úteis para levar em consideração quando estiver construindo alguma solução e estiver em dúvida sobre o uso de try catch ou if else:
uso excessivo de try catch é derivado de um mal projeto, a ideia base do try-catch é você reduzir o seu uso a lugares onde ele possa interceptar tudo que acontece embaixo do capô, evitando assim que aplicações buguem com CTD sem que nenhum rastreamento seja possível. Evitar o uso de IFs é bom, adiciona complexidade ao código e pode gerar mais dor de cabeça do que resolver as coisas.
Gostaria de apenas dar um feedback ou, talvez, mais um passo na refatoracao/evolucao das excecoes do exemplo: não é uma boa ideia colocar o código HTTP dentro das exceções de domínio/negócio.
Aqui vão motivos:
Teorico: código HTTP está relacionado ao protocolo de comuinicação. Portanto, este deve existir apenas na cada de apresentação ou interface de usário (aquele User Interface do DDD).
Prático: dependendo da origem da chamada do endpoint ou do cliente que irá chamar este método, o erro PlayerInventoryException::itemNotFound poderá ter significados diferentes e nem sempre o 403 é o mais apropriado. Portanto a tradução do erro de domínio/negócio para um erro de protocolo deve ser feita na camada mais externa.
Aqui uma ideia de código:
class IradoController { public function equipItem(Request $request): Response { try { // chamada plau } catch (PlayerInventoryException) { return new Response(403, 'Ação não permitida'); } // uau! Nao teve erro } public function showItemDetails(Request $request): Response { try { // chamada chata } catch (PlayerInventoryException) { return new Response(404, 'Item não encontrado'); } // uau! Nao teve erro } }
Parabéns de nv e continue publicando conteúdo de qualidade!
Muito massa aprender a flexibilidade de uma exception, achava que era 'um tipo de erro com algo mais', e de quebra aprender Factory. Gradesso demais pelo artigo primo!
Senior QA Engineer based in Portugal. I write extensively about test automation, performance, best practices, and various other useful things I have learned as a QA professional.
+10 years of XP in the area of technology, programming and community manager. Enthusiast about technology, love games and programming since the age of 12, passionate about football and Mommy of 3.
Hi, my name is Gustavo de Camargo Campos. I'm 22y old. My stacks are Laravel as backend and Vue.js as frontend. I'm an enthusiastic student of Laravel.
Queria apenas perguntar, se não caberia criar uma classe com propriedades estáticas dos códigos HTTP que vão ser usados, pois, inserir os códigos diretamente não seria o famigerado magic number?
Acho que nunca havia olhado para as Exceptions dessa forma, e realmente isso muda tudo.
Excelente artigo, ótimo material para estudar!!!
Eu entendi a ideia, ela parece que deixa as coisas mais claras, porém isso aumenta o número de códigos que vão tratar as exceptions, isso pode gerar um montão de código que você vai precisar dar manutenção quando as regras mudarem.
Eu faço diferente, crio um repositório de mensagens exceptions (ou Resources) e depois uso as referência para dispará-las de dentro dos objetos de negócios, sem mais código envolvido, já que são os objetos de negócios que sabem o que deu errado e eles devem entregar as informações para as camadas superiores de uma forma padrão. A simplicidade às vezes é melhor do que mais código envolvido e mais acoplamentos entre classes ou mais funções.
Talvez sua ideia seja mais aplicável a aplicações onde determinar o que está ocorrendo dentro de uma regra de negócio é complexo e você queira isolar tais regras.
Mas ótimo artigo e parabéns.
Excelente post amigo!! Se me permite um pitaco... Um tempo atrás li sobre o uso abusivo de try catch em desfavor ao uso de lógica com base em condicionais e o resultado é que blocos try catch tornam seu código lento (e caro) e, por este motivo, é desencorajado o uso excessivo salvo guardo ocasiões em que não se sabe qual tratativa realizar (casos desconhecidos pela sua lógica). Deixo aqui dois links úteis para levar em consideração quando estiver construindo alguma solução e estiver em dúvida sobre o uso de try catch ou if else:
uso excessivo de try catch é derivado de um mal projeto, a ideia base do try-catch é você reduzir o seu uso a lugares onde ele possa interceptar tudo que acontece embaixo do capô, evitando assim que aplicações buguem com CTD sem que nenhum rastreamento seja possível.
Evitar o uso de IFs é bom, adiciona complexidade ao código e pode gerar mais dor de cabeça do que resolver as coisas.
Parabéns pelo conteúdo de qualidade :)
Gostaria de apenas dar um feedback ou, talvez, mais um passo na refatoracao/evolucao das excecoes do exemplo: não é uma boa ideia colocar o código HTTP dentro das exceções de domínio/negócio.
Aqui vão motivos:
PlayerInventoryException::itemNotFound
poderá ter significados diferentes e nem sempre o403
é o mais apropriado. Portanto a tradução do erro de domínio/negócio para um erro de protocolo deve ser feita na camada mais externa.Aqui uma ideia de código:
Parabéns de nv e continue publicando conteúdo de qualidade!
foda demais o conteudo, ate salvei pra ler com calma e adaptar o conhecimento pra ruby
Simplesmente incrível! Muito bom artigo!
Excelente artigo, parabéns pelo conteúdo! Obrigado por compartilhar!
Muito massa aprender a flexibilidade de uma exception, achava que era 'um tipo de erro com algo mais', e de quebra aprender Factory. Gradesso demais pelo artigo primo!
Mamma mia, que artigo 🤌
Agradeço pelo post, muito bom aprender sobre essas melhorias
Ótimo artigo!
Excelente artigo!
Muito bom!
Que conteúdo bom! Valeu demais, espero usar de referência pra meus testes techs!
Muito bom o artigo, claro e didático.
Artigo sensacional sobre as exceptions.
Parabéns pelo artigo, muito simples de entender e esclarece muitos pontos importantes!
Didática incrível 👏👏👏
top demais! 👏🏻👏🏻
Excelente artigo!!!
Excelente, muito obrigado!
Conteúdo muito bom, sendo objetivo e com uma didática excelente. Já compartilhando com os colegas.
Já vinha procurando esse tipo de conteúdo faz tempo, sempre tratei os erros
forma genérica. parabéns pelo conteúdo.
Muito bom primo, parabéns pelo conteúdo.
Queria apenas perguntar, se não caberia criar uma classe com propriedades estáticas dos códigos HTTP que vão ser usados, pois, inserir os códigos diretamente não seria o famigerado magic number?
Sim, e eu gosto bastante disso! Geralmente uso algum componente da framework do Symfony ou Laravel da vida pra não ter que criar na mão...
Daniel, sensacional! Mas, por ser método estático não ficaria um pouco mais complicado pra testar?