Tratamento de exceção em 3 camadas com Spring

Boa tarde senhores.

Estou desenvolvendo uma aplicação utilizando PrimeFaces, JSF 2 , Spring 3 e Hibernate. Estou com dúvida de como tratar minhas exceções nas camadas e como apresentar uma mensagem amigavel para o usuário em caso de uma exceção.

No meu managedBean manterGrupoUsuario.java tenho o seguinte método que é invocado quando o usuário tentar remover uma entidade.

	public String doRemoverAction() {

		try {
			controleAcessoService.removerGrupoUsuario(grupoUsuarioSelecionado);
			adicionarMensagemRemovidoSucessoPadrao();
		} catch (ServicoException e) { // Exceção lançada da camada de Serviços
			adicionarMensagemGlobalErro(e.getMessage());
		} catch (Exception e1) { // Exceção lançada por um motivo desconhecio, é necessário ?
			adicionarMensagemExcecaoDesconhecida(e1.getMessage());
		}
		carregarListatem();
		return null;
	}

O código acima que pode lançar uma exceção é controleAcessoService.removerGrupoUsuario(grupoUsuarioSelecionado);. A implementação desse método (classe ControleAcessoServiceImpl.java) é o seguinte:

@Transactional(rollbackFor={ServicoException.class}) @Override public void removerGrupoUsuario(GrupoUsuario grupoUsuario) throws ServicoException { try { grupoUsuarioDAO.remover(grupoUsuario); } catch (PersistenciaException e) { throw new ServicoException(e); } }

Acima está a camada de serviços que simplesmente chama a camada de persistência (GrupoUsuarioDAOWithJPA.java) para remover a entidade. Veja o método da persistência abaixo:

[code] public void remover(GrupoUsuario grupoUsuario) throws PersistenciaException {

	try {
		grupoUsuario.getListaOperacoesFuncionalidade().clear();
		grupoUsuario = entityManager.merge(grupoUsuario);
		entityManager.remove(grupoUsuario);
		entityManager.flush();
	} catch (Exception e) {
		throw new PersistenciaException(e);
	}
}[/code]

Gostaria de saber se o tratamento das exceções estão correto. Imagine o seguinte cenário. O cara tenta remover a entidade e na camada de persistência é lançada uma exceção dizendo que não é possível remover, pois a entidade é chave em outra tabela. Nesse caso o Exception será encapsulado em PersistenceException e relançada para a camada de serviços, que por sua vez encapsula e relança a exceção para a camada de visão.

Existe uma melhor solução para esse problema?

Obrigado

Cara eu to passando por isso é muito chato e importante o tratamento de exceção eu procuro
sempre seguir um padrão de tratar sempre no ultimo nivel sempre vou jogando pra cima
e no fim eu trato ela também não sei se é a melhor maneira mais ta dando certo ! hehe

Eu estava acompanhando este tópico também, mas sem respostas até agora :frowning:

Acho que você deveria pedir para algum moderador mover ele para a seção de arquitetura.

[quote=alexvingg]Cara eu to passando por isso é muito chato e importante o tratamento de exceção eu procuro
sempre seguir um padrão de tratar sempre no ultimo nivel sempre vou jogando pra cima
e no fim eu trato ela também não sei se é a melhor maneira mais ta dando certo ! hehe[/quote]

O certo é ir encapsulando as exceções para exceções da aplicação e sempre deixar a camada que executa a ação poder tratá-la!

Valeu pela dica tiago ! Comecei a fazer isso no projeto q eu to aqui !!