[RESOLVIDO]Duvida com Tratamento de Exceções Personalizadas entre Camadas

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+

Cara não tenho certeza se o que eu vou falar tem haver com oq tu precisa, mas vamos lá:

Supondo oq tu disse, q deu um erro no DAO e tu lança a DAOException… Então na tua classe de Regras de Negocio, que provavelmente é onde tu chama um método do DAO, tu vai ter q ter um try catch lá tb para lançar a DAOException. Tipo assim:

DAO

public void salvar(Usuario usuario) throws DAOException {  
        try{  
            // Código de salvar
        }catch(HibernateException e){  
            throw new DAOException("Ocorreu um erro com o Banco de Dados!");  
        }  
}

RN

public void salvar(Usuario usuario) throws DAOException {
        try{  
            // Código com a chamada para o salvar do DAO
        }catch(HibernateException e){  
            throw new DAOException(e.getMessage(), e);  
        }
}

BEAN

public String salvar() {  
        try {  
            // Código do Bean
        } catch (DAOException e) {  
            FacesMessage facesMessage = new FacesMessage(e.getMessage());  
        }  
        return null;  
    }  
} 

No BEAN, se for a ultima camada antes da tela, tu não vai precisar usar o throws DAOException na assinatura do método, a não ser q no catch do try-catch, tu de um throw new DAOException de novo.

Espero ter ajudado.

Boa noite gabbardo, então cara o fonte que eu postei é o mesmo que o seu com a excessão que devo ter errado em ter lançado o throws DAOException na bean sendo que lá seria necessário somente o try/catch, mais referente ao seu fonte acho que lançar HibernateException na Regra de negocio não seria correto, pois não trabalho direto com a DAO instanciada na RN e sim uma interface da DAO, então acho que na RN deveria tratar dentro do catch com o DAOException, pois ela já estaria encapsulando a mensagem de excessão lançada na DAO e só repassaria na Bean. Mais ainda estou com essas duvidas e agradeço muito a sua ajuda, se puder me ajudar a solucionar esse problema eu agradeço, vlw brother!!!

Mais ninguem?

amigo como vc chama o facescontext na tela?