Tratamento de Exceptions nos Dao's  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Olá, numa aplicação J2EE, é errado tratar exceptions nos DAO's?? No meu mode ver acho que as exceções deveria ser tratadas pelo controller, pois do controller eu poderia popular os objetos pra view e mostras as exceptions formatadas ao usuário;

O que vocês acham??


Além do mais que tipo de Exception um DAO pode lançar, seria melhor ele lançar JDBCException, ou Exception??


When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

danielbussade wrote:
Além do mais que tipo de Exception um DAO pode lançar, seria melhor ele lançar JDBCException, ou Exception??


DAOException parece razoável. JDBCException não. Isto porque está fazendo referencia directa à api JDBC. Um dao pode usar JDBC mas pode usar outras tecnologias tb. Assim a exception não deve ter o nome de nenhuma API. A exceção poderá ser checked ou não conforme o seu gosto. A excção deve encapsular outras exceções internas sem destruir o stacktrace.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

sergiotaborda wrote:
danielbussade wrote:
Além do mais que tipo de Exception um DAO pode lançar, seria melhor ele lançar JDBCException, ou Exception??


DAOException parece razoável. JDBCException não. Isto porque está fazendo referencia directa à api JDBC. Um dao pode usar JDBC mas pode usar outras tecnologias tb. Assim a exception não deve ter o nome de nenhuma API. A exceção poderá ser checked ou não conforme o seu gosto. A excção deve encapsular outras exceções internas sem destruir o stacktrace.



Olá, o problema de criar uma excessao como DAOException é o seguinte, supondo que tenho o metodo save deste jeito:


When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
rodrigo_gomes
GUJ Master
[Avatar]

Membro desde: 25/11/2003 15:45:21
Mensagens: 1088
Localização: São Paulo
Offline

Ola,

Entao coloque um try/catch para essa exceçao (ConstraintViolationException) e crie uma expection que a encapsule para relanca-la.

rodrigo de paiva gomes




http://twitter.com/rod_gomes
[WWW] [MSN] [ICQ]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

rodrigo_gomes wrote:Ola,

Entao coloque um try/catch para essa exceçao (ConstraintViolationException) e crie uma expection que a encapsule para relanca-la.



Olá rodrigo, obrigado pela dica, pensei em fazer isto, acontece que não sei de antemão quais excessões seriam lancaçadas entendeu??
E criando uma nova exception para encapsular cada uma, poderia acabar com muitas exceptions, entende??


Agora é correto tratar exceptions nos DAO's?? Acho que não teria o que fazer a não ser relançar uma nova excessão , por isso pensei em colocar algo do tipo throws HibernateException, e tratar tudo no controller, pois é onde eu consigo acesso a view do cliente;
O que você acha??

Obrigado!

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
rodrigo_gomes
GUJ Master
[Avatar]

Membro desde: 25/11/2003 15:45:21
Mensagens: 1088
Localização: São Paulo
Offline

Vc nao precisa tratar todas as exceptions que o banco pode lançar. Vc pode colocar try/catch somente para as exceptions que vc quer fazer um tratamento diferente, como mandar uma mensagem diferente para o usuario.

Quanto a tratar exceptions no dao, acho que soh precisa tratar se vc quiser um desacoplamento entre seu dao e quem o chama...ou seja, se vc nao se importa em seu controller saber que seu dao está usando hibernate, faça como vc disse. Ao contrario lance suas proprias exceptions.

[]'s

rodrigo de paiva gomes




http://twitter.com/rod_gomes
[WWW] [MSN] [ICQ]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Ok rodrigo, achei interessante o modo como você disse, agora só mais uma dúvida: Imagine que eu tenha o seguinte cenário:



Os dois são unique keys, ai na minha tela de cadastro quando o aluno tenta cadastrar uma aluno já existente ele vai lancar um constraintViolationException que será tratado e apresentado na tela, a seguinte mensagem.

Aluno ja cadastrado.

A minha dúvida é a seguinte, eu queria saber por qual campo foi violada a integridade, pra mostrar uma mensagem melhor ao usuário:

Tipo CPF já cadastrado
ou
Matricula já cadastrada;

Sabe como resolver isto??


Valeu

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
flaviosf
Debugger

Membro desde: 12/08/2005 14:55:11
Mensagens: 53
Localização: Pouso Alegre - MG
Offline

Olá.

Você pode criar uma classe responsável por tratar todos as excecoes do sistema, inclusive nas DAOs. Essa classe herdará de Exception:


Por exemplo, nos métodos das DAOs, que deverão ter o try-catch, você instancia a classe de exceção:

Essa mensagem será lançada para o usuário. Essa implementação é adequada para os casos que o nosso colega mencionou, mensagem diferentes para cada tipode exceção.

Espero ter ajudado.

Abraço.

Flávio da Silva Ferreira - Analista de Sistemas Pleno

Transit Telecom - www.transitbrasil.com.br
[Email]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Olá , então nos métodos do DAO , eu faria o seguinte:



Desta forma, eu não perco a verdadeira excessão que houve, pois no controller eu posso fazer


Agora a minha dúvida é a seguinte, e pra métodos de pesquisa, como :



Aqui, se minha lista volta vazia, é legal eu ter estas validações no DAO e lançar uma exception tipo:



ou

Eu té melhor testar isto no Controller , verificando se a list voltou nula??

Valeu



When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
rodrigo_gomes
GUJ Master
[Avatar]

Membro desde: 25/11/2003 15:45:21
Mensagens: 1088
Localização: São Paulo
Offline

danielbussade wrote:
Eu té melhor testar isto no Controller , verificando se a list voltou nula??


prefiro essa abordagem.

rodrigo de paiva gomes




http://twitter.com/rod_gomes
[WWW] [MSN] [ICQ]
rafabene
Thread.start()

Membro desde: 03/07/2003 11:32:16
Mensagens: 49
Offline

rodrigo_gomes wrote:
danielbussade wrote:
Eu té melhor testar isto no Controller , verificando se a list voltou nula??


prefiro essa abordagem.


As boas práticas dizem que uma lista nunca deve ser nula. O correto seria retornar uma lista vazia! De resto, é a melhor opção mesmo.

Rafael Benevides
JBoss Consultant
Red Hat
JBCAA, SCEA, SCBCD 5, SCWCD 1.4, SCJP 1.4, SCJA

http://www.jroller.com/rafaelbenevides
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Olá, estou fazendo o tratamento de exceptions no DAO's da seguinte forma:




Perguntas:

É errado trabalhar assim, fazendo istanceof de excessões??
Quanto a questão do log, existe maneira melhor de fazer??


Gostataria de críticas e sugestões sobre este modo de trabalhar..


Obrigado

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Ola Daniel

O Log esta ok! É bom so logar mesmo quando nao for mais lancar a exception, senao é o conhecido log and throw anti pattern.

Sobre a exception, na minha opiniao fazer instanceof nao é uma boa. Alem disso, se a root cause nao for essa que voce esta esperando, (ex: se der uma NullPointerException), voce ta fazendo o catch e simplesmente nao fazendo nada! Ta engolindo a exception.. ela vai ocorrer e voce nem vai ficar sabendo. A pagina do jsp vai aparecer normalmente, nenhum log, nenhuma mensagem sera apresentada.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
danielbussade
JavaEvangelist

Membro desde: 13/09/2007 09:26:21
Mensagens: 415
Localização: Itaperuna -RJ
Offline

Paulo Silveira wrote:Ola Daniel

O Log esta ok! É bom so logar mesmo quando nao for mais lancar a exception, senao é o conhecido log and throw anti pattern.

Sobre a exception, na minha opiniao fazer instanceof nao é uma boa. Alem disso, se a root cause nao for essa que voce esta esperando, (ex: se der uma NullPointerException), voce ta fazendo o catch e simplesmente nao fazendo nada! Ta engolindo a exception.. ela vai ocorrer e voce nem vai ficar sabendo. A pagina do jsp vai aparecer normalmente, nenhum log, nenhuma mensagem sera apresentada.


Obrigado Paulo pelas dicas, eu esqueci de postar o resto na verdade eu faço assim:



Esse método getInitCause, pega a causa inicial de Exception que está encpasulada dentro de DaoException enquanto ela for diferente de null, ele vai descendo até chegar na causa inicial:

Gostaria até de saber se já existe algum método para isso??

Outra coisa como você aconselheria a fazer, para verificar se o usuário já está cadastrado no sistema, e apresentar para o usuário na tela??


Obrigado

When you steal from one author, is called plagiarism, when you steal from many is called research.

[WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

danielbussade wrote:
Olá, o problema de criar uma excessao como DAOException é o seguinte, supondo que tenho o metodo save deste jeito:



O seu problema é entender como trabalhar com exeções.
Para começar leia isto

como ficaria o codigo



Num DAO não ha tratamento nenhum para o usuário final. É expressamente proibida a utilização de funções de comunicação com o usuário final, tal como objetos Swing por exemplo.
Vc tem que separar as exeções que recebe da API mais baixa para exceções da API mais alta. às vezes é 1:1, às vezes não. As que vc não souber deparar vc coloca numa exceção generica. É o caro que chamar o DAO que vai tratar as execções e comunicar com o usuário se for necessário. (na realidade isso só deve acontecer na camada GUI)

Na minha opinião seria melhor DAOException herdade de RuntimeException,caso contrario vc vai ter muito trabalho. Mas isso é a minha opinião.

Cuidado com exceções especias como NullPointerException. Sempre verifique que as coisas não são null antes das usar.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team