Pessoal, tenho dúvida no tratamento de exceções. Existe um padrão? Devo criar uma classe que estenda Exception? Qual o jeito ideal de se tratar?
OBS: sei usar try/catch…minha dúvida é em um padrão de tratamento…
Pessoal, tenho dúvida no tratamento de exceções. Existe um padrão? Devo criar uma classe que estenda Exception? Qual o jeito ideal de se tratar?
OBS: sei usar try/catch…minha dúvida é em um padrão de tratamento…
bom dia.
eu particularmente gosto de criar uma exceção para cada tipo de erro. UsuarioInvalidoException, PedidoDeCompraNaoCadastradoException, etc.
Acho que o código fica mais legível.
abraços.
bom, mas ae também seria legal criar um package dominio.com.Exception…basicamente vc cria classe que estende Exception para cada método que você tem?
no projeto que estou atuando hj temos uma package exception, tipo, br.com.dominio.exceptions. Nessa package guardamos todas as exceções.
[quote]
basicamente vc cria classe que estende Exception para cada método que você tem?[/quote]
nem sempre, as vezes um método pode lançar mais de um exceção, ou uma mesma exceção pode ser lançada por mais de uma método.
fica a gosto do fregues. rsr
veja se os dois link a seguir ajuda:
tratamento de execoes na prática
flw! qualquer duvida so gritar
// CLASSE DAO
public class DesktopDao {
private Session session;
private Dao<Desktop> dao;
public DesktopDao(Session session){
this.session = session;
dao = new Dao<Desktop>(this.session, Desktop.class);
}
public Desktop find(Long id) throws HibernateException{
Desktop desk = dao.find(id);
if(desk == null)
throw new HibernateException();
return dao.find(id);
}
}
//CLASSE DE NEGOCIOS
desktop = factory.getDesktopDao().find(1L);
try{
System.out.println(desktop.getId());
}
catch(HibernateException e){
InicializaAplicacao app = new InicializaAplicacao();
app.inicializarAplicacao(factory);
}
Seria certo fazer isso? se sim, todo método de manipulação no banco vou ter que usar try/catch?? Aí a aplicação vai ter um monte de try/catch na área de negócios…Isso é certo??? vlw…
bem a questao é o vc analisar o seguinte de onde vem API? de Exception? se sim tera que usar isso é requisito. mesma coisa de vc nao poder usar IOI sem se vc nao usar try/cacth, o codigo nem compila pq as classes IOI deriva de Exception.
as exceções que podem ser geradas não são diretas de Exception, a maioria é de RunTimeException… maioria são as do hibernate, ObjectNotFoundException
se vem de RuntimeException vc nao precisa nem tratar nem declarar…
[quote=Thiago Domingues]
// CLASSE DAO
public class DesktopDao {
private Session session;
private Dao<Desktop> dao;
public DesktopDao(Session session){
this.session = session;
dao = new Dao<Desktop>(this.session, Desktop.class);
}
public Desktop find(Long id) throws HibernateException{
Desktop desk = dao.find(id);
if(desk == null)
throw new HibernateException();
return dao.find(id);
}
}
//CLASSE DE NEGOCIOS
desktop = factory.getDesktopDao().find(1L);
try{
System.out.println(desktop.getId());
}
catch(HibernateException e){
InicializaAplicacao app = new InicializaAplicacao();
app.inicializarAplicacao(factory);
}
Seria certo fazer isso? se sim, todo método de manipulação no banco vou ter que usar try/catch?? Aí a aplicação vai ter um monte de try/catch na área de negócios…Isso é certo??? vlw…[/quote]
Não. A sua classe DAO deve encapsular todos os exceptions apanhados internamente (catch) e lançar um outro exception (exemplo um DAOException)
Essa nova exeção deve ser não=verificada. Assim vc não polui os métodos de negocio
dê uma olhada nas boas práticas de exceções
Seria algo do tipo??
// CLASSE DAO
public class DesktopDao {
private Session session;
private Dao<Desktop> dao;
public DesktopDao(Session session){
this.session = session;
dao = new Dao<Desktop>(this.session, Desktop.class);
}
public Desktop find(Long id) {
try{
Desktop desk = dao.find(id);
}
catch(ObjectNotFoundException e){
throw new DAOException(e);
}
return dao.find(id);
}
}
//CLASSE DE NEGOCIOS
desktop = factory.getDesktopDao().find(1L);
vc nao pode colocar o catch dentro do try{} ja uqe nao é possivel ter o try{} sozinho.
try{}
catch{}
tem que ser nessa linha… veja os exemplo de codigo simples que passei no link, se aplica a qualquer tipo de situacao, ja que eh uma regra.
eu sei…foi erro de digitação…já editei…
[quote=sergiotaborda]
Não. A sua classe DAO deve encapsular todos os exceptions apanhados internamente (catch) e lançar um outro exception (exemplo um DAOException)
Essa nova exeção deve ser não=verificada. Assim vc não polui os métodos de negocio
dê uma olhada nas boas práticas de exceções[/quote]
E nos métodos de negócio o que devo fazer se a exceção for lançada? como ficaria a declaração de um método de negócio?
[quote=Thiago Domingues][quote=sergiotaborda]
Não. A sua classe DAO deve encapsular todos os exceptions apanhados internamente (catch) e lançar um outro exception (exemplo um DAOException)
Essa nova exeção deve ser não=verificada. Assim vc não polui os métodos de negocio
dê uma olhada nas boas práticas de exceções[/quote]
E nos métodos de negócio o que devo fazer se a exceção for lançada? como ficaria a declaração de um método de negócio?[/quote]
se aconteceu exceção vc so tem dois caminhos:
mas uma hora alguem tem que tratar essa exceção…
[quote=LPJava][quote=Thiago Domingues][quote=sergiotaborda]
Não. A sua classe DAO deve encapsular todos os exceptions apanhados internamente (catch) e lançar um outro exception (exemplo um DAOException)
Essa nova exeção deve ser não=verificada. Assim vc não polui os métodos de negocio
dê uma olhada nas boas práticas de exceções[/quote]
E nos métodos de negócio o que devo fazer se a exceção for lançada? como ficaria a declaração de um método de negócio?[/quote]
[/quote]
A mesma regra se aplica. Sempre entre camadas existe uma exceção mãe e só filhas dela são lançadas. No DAO é DAOException
na camada de negocio é BusinessException ou ServiceException, dependendo da sua arquitetura.