Boa tarde pessoal, depois de perder um dia lendo varios topicos no GUJ e googlando muito, resolvi criar um topico pois ainda estou com algumas duvidas referente ao tratamento de exceções personalizadas quando se trata de desenvolvimento em camadas, seguinte:
estou desenvolvendo um sistema WEB somente para aprendizado, e trabalhando com as seguintes camadas:
DAO
Regra de Negocios
Bean (JSF)
Modelo (Perssistencia - Hibernate)
criei 2 exceções personalizadas, sendo elas DAOException, RNException sobreescrevendo os metodos principais da Exception
as classes estão abaixo:
DAOException
package financeiro.util;
public class DAOException extends Exception {
private static final long serialVersionUID = -3076694111010684064L;
public DAOException() {
}
public DAOException(String message) {
super(message);
}
public DAOException(Throwable cause) {
super(cause);
}
public DAOException(String message, Throwable cause) {
super(message, cause);
}
}
RNException
package financeiro.util;
public class RNException extends Exception {
private static final long serialVersionUID = 4979810730782212600L;
public RNException() {
}
public RNException(String message) {
super(message);
}
public RNException(Throwable cause) {
super(cause);
}
public RNException(String message, Throwable cause) {
super(message, cause);
}
}
a minha duvida é a seguinte, geralmente essas exceptions vão capturar mensagens de exceção das suas respectivas camadas e encapsula-las, mais como irei mostrar isso para o usuário, exemplo mais concreto, digamos que ocorra um erro de conexão com o banco de dados na DAO, ae lancarei para o construtor da Exception DAOException uma mensagem e a causa(Throwable) e depois irei relançar esse erro nas camadas superiores até chegar na Bean e exibir para o usuario? Pois pelo que andei lendo isso seria totalmente incorreto já que para cada camada existe um Exception especifica, ae nesse caso eu teria a mensagem de erro encapsulada e faria o que com ela?
exemplo:
DAO
public void setSession(Session session) throws DAOException{
try{
this.session = session;
}catch(HibernateException e){
throw new DAOException("Ocorreu um erro com o Banco de Dados!");
}
}
RN
public void salvar(Usuario usuario) throws DAOException{
Integer codigo = usuario.getCodigo();
if(codigo == null || codigo == 0){
usuario.getPermissao().add("ROLE_USUARIO");
this.usuarioDAO.salvar(usuario);
CategoriaRN categoriaRN = new CategoriaRN();
categoriaRN.salvarEstruturaPadrao(usuario);
}else{
this.usuarioDAO.atualizar(usuario);
}
}
Bean
public String salvar() throws DAOException{
try
{
FacesContext facesContext = FacesContext.getCurrentInstance();
String senha = this.usuario.getSenha();
if(!senha.equals(this.confirmaSenha)){
FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente.");
facesContext.addMessage(null, facesMessage);
return null;
}
UsuarioRN usuarioRn = new UsuarioRN();
usuarioRn.salvar(this.usuario);
if(this.conta.getDescricaoConta() != null){
this.conta.setUsuario(usuario);
this.conta.setFavorita(true);
ContaRN contaRN = new ContaRN();
contaRN.salvar(this.conta);
}
return destinoSalvar;
} catch (DAOException e) {
FacesMessage facesMessage = new FacesMessage(e.getMessage());
}
return null;
}
}
Pessoal qualquer tipo de ajuda ou critica será bem vinda, desde já agradeço a atenção, t+