| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 06:55:08
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Sim....vc não pode lançar a mesma exception que tratou dentro do salvar.
Na verdade, a forma flexível é vc criar uma exception padrão sua de serviço que reflita erros da própria camada e lançar, emitindo uma mensagem padrão de serviço.
A camada adjacente usuário deve deter conhecimentos das exceptions internas ocorridas.
|
Fernando Franzini |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 08:15:47
|
ddark.emanu
JavaChild
![[Avatar]](/images/avatar/8dddd5d6f5c804dc8c34745c7bd2036e.jpg)
Membro desde: 06/10/2010 16:09:16
Mensagens: 118
Localização: Cianorte - PR
Offline
|
Continua o problema de não captura - la na camada de cima .
|
EmmanueL Neri |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 08:18:53
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Fico ok agora!!!!
Continua oq??
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 08:21:29
|
ddark.emanu
JavaChild
![[Avatar]](/images/avatar/8dddd5d6f5c804dc8c34745c7bd2036e.jpg)
Membro desde: 06/10/2010 16:09:16
Mensagens: 118
Localização: Cianorte - PR
Offline
|
|
EmmanueL Neri |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 08:56:35
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Vc ta lançando a exception devidamente no método salvar()...o código q vc postou não esta!
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:13:55
|
ddark.emanu
JavaChild
![[Avatar]](/images/avatar/8dddd5d6f5c804dc8c34745c7bd2036e.jpg)
Membro desde: 06/10/2010 16:09:16
Mensagens: 118
Localização: Cianorte - PR
Offline
|
Estou lançando aqui
e capturando no salvar
|
EmmanueL Neri |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:19:14
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Sua exception deve ser checkada!! como vc fez?
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:19:14
|
tnaires
GUJ Master
![[Avatar]](/images/avatar/5f6371c9126149517d9ba475def53139.png)
Membro desde: 22/12/2003 08:05:58
Mensagens: 1678
Localização: Porto Alegre/RS - Natal/RN
Offline
|
Olá. Vou mostrar como geralmente realizo o tratamento de exceções.
Tomemos um exemplo. Vamos supor que tenho a seguinte classe Usuario:
Agora tenho um service que faz o cadastro de um novo usuário usando um DAO:
E tenho um managed bean que contém um método que usa o service:
Partindo do cenário acima, vamos supor que quero inserir a seguinte regra:
Os campos login e senha não podem ser vazios.
Vamos começar criando uma classe para representar erros de negócio, conforme sugerido pelo colega FernandoFranzini:
Reparem que a exceção herda de RuntimeException. Isso é para evitar que precisemos declarar throws Exception em cada método que trata essa exceção.
Agora vamos modificar a classe Usuario para validar nossa regra:
Nosso service deve ser modificado agora para realizar esse tratamento, e propagar essa exceção para o managed bean. Se quisermos, podemos usar a idéia do colega FernandoFranzini e criar também uma exceção para representar erros nos services. Afinal, aqui podem acontecer erros de vários tipos além de erros de negócio.
Observem que na exceção anterior estamos passando pro construtor da superclasse a causa do erro. Isso é muito importante! Devemos sempre criar nossas exceções passando também a exceção que representa a causa.
Segue abaixo o service modificado:
Então, quando a exceção chegar no managed bean, fazemos o tratamento necessário:
|
Tarso Nunes Aires
Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:41:28
|
von.juliano
GUJ Master
![[Avatar]](/images/avatar/efb61dd984183066a8815190a28bd956.jpg)
Membro desde: 15/01/2007 13:31:32
Mensagens: 1266
Offline
|
FernandoFranzini wrote:
Defina pelo menos uma exception para cada camada.
Persistência - AcessoException
Negocio - NegocioExcetoptin
Visão - VisaoException
Na camada de visão vc pega o texto e imprime para o usuario.
Acho essa abordagem um tanto ultrapassada. Essa perspectiva leva à criação de inúmeras exceptions desnecessárias, uma para cada camada, que nada faz além de conter a lançada pela camada anterior - o que chega na camada de visão é uma exceção de visão que contém uma de negócio, que contém uma de persistência, um pacotão.
Já discuti com várias pessoas sobre a melhor forma de administrar as exceções, e até um tempo atrás, usávamos um interceptor que capturava todas as exceções - nós lançavamos e só eram pegas aquelas referentes ao comportamento do próprio sistema (LoginInvalidoException, por exemplo), as demais exceções eram tratadas por esse interceptor. Já é uma abordagem melhor, mas aí percebi que era um trabalho a mais, pois á um mecanismo nativo que faz isso: a tag error-page do web.xml (falando aqui de sistemas web, claro). Nela pode-se especificar qual exception leva para qual página de erro, assim você pode lançar as exceções de banco, de envio de email, etc, e não se preocupar em qual camada ela deve ser tratada, isso será feito na mais alta.
Flw!
|
É difícil manter-se religioso quando algumas pessoas simplesmente não são carbonizadas por raios!
Desenvolvendo software de forma simples! - http://vonjuliano.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:45:23
|
ddark.emanu
JavaChild
![[Avatar]](/images/avatar/8dddd5d6f5c804dc8c34745c7bd2036e.jpg)
Membro desde: 06/10/2010 16:09:16
Mensagens: 118
Localização: Cianorte - PR
Offline
|
FernandoFranzini wrote:Sua exception deve ser checkada!! como vc fez?
não fiz checagem ... apenas capiturei a exception(ConstrantViolation) no método adicionar e criei uma nova exception (RegistroDuplicado) e no metodo salvar (na camada de Controller) executei o metodo adicionar onde ocorre o erro de ConstrantViolation e tentei capturar a execption que criei(RegistroDuplicado) para enviar uma mensagem personalizada para tela.
está errado esse pensamento ?
This message was edited 1 time. Last update was at 28/09/2011 09:53:07
|
EmmanueL Neri |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 09:51:42
|
ddark.emanu
JavaChild
![[Avatar]](/images/avatar/8dddd5d6f5c804dc8c34745c7bd2036e.jpg)
Membro desde: 06/10/2010 16:09:16
Mensagens: 118
Localização: Cianorte - PR
Offline
|
tnaires wrote:Olá. Vou mostrar como geralmente realizo o tratamento de exceções.
[/code]
Então, quando a exceção chegar no managed bean, fazemos o tratamento necessário:
[code]class UsuarioBean {
public void criarUsuario() {
try {
usuarioService.create(login, senha);
} catch (ApplicationException ex) {
// Exibir mensagem de negócio para o usuário.
}
}
}[/code]
Acredito que fizemos diferente e chamos ao mesmo lugar no final ....
mas no final não consegui capturar a execption igual vc capturou no criarUsuario , acredito que seja pela sua validação
[code]
if(objeto.isEmpty)
throw new Exeption()
[/code]
mas como vou fazer essa validação se é erro de banco (ConstrantViolation) ?
obs : me corrija se eu estiver errado
This message was edited 2 times. Last update was at 28/09/2011 10:15:39
|
EmmanueL Neri |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 11:48:25
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Acho essa abordagem um tanto ultrapassada. Essa perspectiva leva à criação de inúmeras exceptions desnecessárias, uma para cada camada, que nada faz além de conter a lançada pela camada anterior - o que chega na camada de visão é uma exceção de visão que contém uma de negócio, que contém uma de persistência, um pacotão.
Pode existir aplicações que não contenham regras de negocio complexa que com uma exception genérica por camada já resolve o problema...vendo que hoje um sistema distribuído multicamadas pode chegar em 4 ou 5 camadas logicas e/ou distribuídas...sua justificativa de números de exceptions é inconsistente.
E outra, pode existir aplicações que contenham regras de negocio complexa e por isso exista a necessidade varias exception por erro de negocio....tudo esta relacionado com necessidade....justificar com algo ultrapassado tb é inconsistente...Pode não ser o seu cenário mas pode ser de milhões outros.
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 12:40:19
|
von.juliano
GUJ Master
![[Avatar]](/images/avatar/efb61dd984183066a8815190a28bd956.jpg)
Membro desde: 15/01/2007 13:31:32
Mensagens: 1266
Offline
|
FernandoFranzini wrote:Pode existir aplicações que não contenham regras de negocio complexa que com uma exception genérica por camada já resolve o problema...vendo que hoje um sistema distribuído multicamadas pode chegar em 4 ou 5 camadas logicas e/ou distribuídas...sua justificativa de números de exceptions é inconsistente.
E outra, pode existir aplicações que contenham regras de negocio complexa e por isso exista a necessidade varias exception por erro de negocio....tudo esta relacionado com necessidade....justificar com algo ultrapassado tb é inconsistente...Pode não ser o seu cenário mas pode ser de milhões outros.
O caso é que exceções genéricas não fazem sentido. Lançar DaoException ou BusinessException não diz nada, o ideal seria lançar uma exceção para uma dada situação, como FundosInsufucientesException. E não importa o nível de complexidade das regras de negócio do sistema, o que importa é que as exceções sejam representativas dentro do domínio, seja simples ou não.
Acho que não fui claro no seguinte, não sou contra criar várias exceções para n situações, o que disse é que você não precisa lançar exceções de banco que devem ser pegas na camada de negócio, que vai empacotá-la com outra e mandá-la para a camada view, isso que é uma abordagem ultrapassada. Se você recebe uma SQLException ao não conseguir conectar no banco, é realmente necessário empacotá-la? Isso é que deve ser levado em consideração. Ao dizer que deve haver uma exceção genérica para cada camada, fica a clara impressão de que você precisa passar por elas quando um erro ocorre, o que não é verdade. Se a exceção deve ser tratada de uma camada para a outra (não encontrou o login), ok, sem problemas, mas uma exceção de que o banco está fora não precisa ser capturada na camada de negócio, se for apenas informar para o usuário que ele deve tentar mais tarde. Em resumo, cuidado com essas obrigatoriedades entre camadas!
Flw!
|
É difícil manter-se religioso quando algumas pessoas simplesmente não são carbonizadas por raios!
Desenvolvendo software de forma simples! - http://vonjuliano.wordpress.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 12:43:36
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
O caso é que exceções genéricas não fazem sentido. Lançar DaoException ou BusinessException não diz nada,
Logico que faz...desde que a mensagem de erro esteje clara dentro do objeto, uma vez que duas exception pode ser do mesmo tipo, com diferentes significados. Existem inúmeros casos dentro de varias especificações: JDBC, JPA etc....
Acho que não fui claro no seguinte, não sou contra criar várias exceções para n situações, o que disse é que você não precisa lançar exceções de banco que devem ser pegas na camada de negócio, que vai empacotá-la com outra e mandá-la para a camada view, isso que é uma abordagem ultrapassada. Se você recebe uma SQLException ao não conseguir conectar no banco, é realmente necessário empacotá-la?
Eu tb concordo....embora muitas produtos façam isso.... minha dica não foi para empacotar...foi para TRADUZIR e repassar outra exception em nível de serviço.
Eu entendi sim...acho muito legal sua opinião e todos crescemos com isso...eu particularmente só acho que quando vc invalidar uma opções arquitetural vc tem q ter justificativas coerentes.... cenário versus pros e contras.....
This message was edited 6 times. Last update was at 28/09/2011 12:51:55
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2011 12:53:29
|
von.juliano
GUJ Master
![[Avatar]](/images/avatar/efb61dd984183066a8815190a28bd956.jpg)
Membro desde: 15/01/2007 13:31:32
Mensagens: 1266
Offline
|
FernandoFranzini wrote:Logico que faz...desde que a mensagem de erro esteje clara dentro do objeto, uma vez que duas exception pode ser do mesmo tipo, com diferentes significados. Existem inúmeros casos dentro da própria de varias especificações JDBC, JPA etc....
Não, não faz. Não existe uma JPAException na JPA nem uma JDBCException no JDBC. Preste atenção amigo, há uma grande diferença entre SQLException e DaoException.
FernandoFranzini wrote:Eu tb concordo....embora muitas produtos façam isso.... minha dica não foi para empacotar...foi para TRADUZIR e repassar outra exception em nível de serviço.
Ainda sim, não há o que traduzir numa exceção que indica que o banco está fora. Não é porque é uma exceção gerada no banco que deve necessariamente ser traduzida para ser passada para a frente, já que o que ela representa é mais do que claro.
|
É difícil manter-se religioso quando algumas pessoas simplesmente não são carbonizadas por raios!
Desenvolvendo software de forma simples! - http://vonjuliano.wordpress.com/ |
|
|
 |
|
|