Capturar Exceção - catch

Amigos,

estou inserindo dados com banco de dados usando o metodo save Generic,

estou querendo capturar a Exceção quando o usuário inserir um valor incorreto em um determinado campo,

dentro do metodo abaixo ele entra no catch, mas nos metodo que faz a chamada nesse metodo ele retorna como se não houvesse erro ao inserir,

como posso capturar essa exceção

[code]
public T save(T object) throws Exception {
try {
//Le as configurações de Banco configurada no persistence.xml
EntityManager em = new UtilFactoryDAO().getEntityManager();

		//Abre a transação
		em.getTransaction().begin();

// em.merge(object);

		//persiste o objeto
		em.persist(object);
		
		//comita a transação
		em.getTransaction().commit();
		
		//Fecha p entity manager
		em.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return object;
}[/code]

O que você chama de “valor incorreto em um determinado campo”? Se o campo for um VARCHAR que armazena um CPF e no INSERT estiver algo como “bacon frito” não teria erro nenhum lançado. Isso você tem que validar antes de chegar na persistência.

Seja lá qual for a exceção,

por exemplo o usuário tentar inserir um valor “bacon frito” em um campo DATE ou NUMBER etc…

[quote=thiagoRibeiro]Seja lá qual for a exceção,

por exemplo o usuário tentar inserir um valor “bacon frito” em um campo DATE ou NUMBER etc…[/quote]Seus atributos estão todos como String? Se sim isso seria possível acontecer. Se não, é como já lhe foi dito: isso já aconteceria antes.

Para forçar o erro acontecer dentro do seu try/catch você teria que chamar o método flush(); através do entity manager.

Hebert,

eu alterei meus objetos que estavam todos como String para Integer e Double (objeto e não primitivo) porém deu o mesmo erro,

tentei tb a alteração usando o metodo flush(); mas tb não funcionou conforme abaixo

	@Override
	public T save(T object) throws Exception {
		try {
			//Le as configurações de Banco configurada no persistence.xml
			EntityManager em = new UtilFactoryDAO().getEntityManager();
			
			//Abre a transação
			em.getTransaction().begin();
			
//			em.merge(object); 
			
			//persiste o objeto
			em.persist(object);
			em.flush();
			
			//comita a transação
			em.getTransaction().commit();
			
			
			//Fecha p entity manager
			em.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}

[quote=thiagoRibeiro]eu alterei meus objetos que estavam todos como String para Integer e Double (objeto e não primitivo) porém deu o mesmo erro,[/quote]Que erro? Tinha que dar erro mesmo?

E o quê deveria estar errado? Você ainda não nos disse qual dado deveria ter dado erro e o motivo pelo qual deveria ter dado erro. Poste o código da entidade também.

Eu estou achando que o que você precisa é uma validação do objeto.

O problema e que deu o erro no meu metodo save isso no nivel do DAO,

quando chega no nível antes de exibir na tela a msg de sucesso ou erro deveria entrar no catch do meu

 try{
}catch(Exception e){
e.printStackTrace();
}

mas não entra

entenderam ?

[quote=thiagoRibeiro]O problema e que deu o erro no meu metodo save isso no nivel do DAO,

quando chega no nível antes de exibir na tela a msg de sucesso ou erro deveria entrar no catch do meu

 try{
}catch(Exception e){
e.printStackTrace();
}

mas não entra

entenderam ?[/quote]Então é melhor você estudar mais um pouco java antes de continuar com o JPA. Você ñ está fazendo nada com a expcetion se não mostrar o erro no console… e.printStackTrace(); …

Você tinha que jogar essa exception para o método que o está chamando…

Acho que não estou conseguindo passar corretamente o meu problema…Vou tentar dessa forma
Tenho 3 camadas em minha aplicação Delegate, BO, DAO

No delegate tenho um método parecido com o abaixo no qual faz uma chamada para a camada BO que faz uma chamada para o DAO,
ESTOU FORÇANDO um dado na tela para dar erro quando inserir um valor invalido no campo da tela, quando faço isso da um erro no meu método do DAO (ESTA CORRETO) e entra no meu catch, o que quero e que isso acontece quando eu ter o retorno no meu método no delegate (QUE E A 1° CHAMADA DEPOIS DA TELA QUE O USUÁRIO COLOCA AS INFORMAÇÕES) e dentro do catch eu uso o FacesMessage do JSF para mostrar na tela a msg para o usuário no caso do erro

Método na camada do DELEGATE

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		boolean retorno = false;
		try {
			retorno = salvarObjetoBO.salvar(objeto);
			
			if(retorno == true){
				FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,  "Valores Salvo com Sucesso", "Valores Salvo com Sucesso");
				context.addMessage("", message);
			}else{
				FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,  "Ocorreu um erro ao Inserir os valores", "Ocorreu um erro ao Inserir os valores");
				context.addMessage("", message);
			}			
		} catch (Exception e) {
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,  "Ocorreu um erro ao Inserir os valores", "Ocorreu um erro ao Inserir os valores");
			context.addMessage("", message);
			e.printStackTrace();
		}
		return "retornaParaTela";
	}

Método na camada do BO

public boolean salvar(Objeto objeto){		
		boolean retorno = false;
		try {
			retorno = meuDAO.save(objeto);			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return retorno;
	}

Método na camada do DAO

Fiz uma alteração no meu método do DAO alterando o tipo dele para um boolean, com isso lá no meu DELEGATE faço uma verificação para saber se inseriu as informações com sucesso ou não ai da certo o que eu quero Mas no caso de erro não entra no catch no meu delegate (sei que deu erro devido o retorno de false da minha variável no meu metodo do DAO)

    public boolean save(T obj) {
    	//Le as configurações de Banco configurada no persistence.xml
    	EntityManager em = new UtilFactoryDAO().getEntityManager();        
        try {			
			//Abre a transação
			em.getTransaction().begin();
			
//			em.merge(object); 
			
			//persiste o objeto
			em.persist(obj);
			
			//comita a transação
			em.getTransaction().commit();
            em.flush();  
			
			//Fecha p entity manager
			em.close(); 
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            em.getTransaction().rollback();  
            return false;  
        } finally {  
            em.close();  
        }  
    }