Tratamento de erro SQLException

9 respostas
D

Saudações a todos…

Sou iniciante em Java, e estava montando uma classe DAO
com método de update no banco, criei esse método

public boolean alterar(CadCliente cadCliente) throws SQLException, Exception
	{
        PreparedStatement pst = null;
        try 
        {
            openConnectionOracle();     
            pst = con.prepareStatement("UPDATE CADCLIENTE_EDSON SET " +                        
                                       "NMCLIENTE = ?, " +
                                       "NMENDERECO = ?, " +
                                       "NMBAIRRO = ?, " +
                                       "NMCIDADE = ?, " +
                                       "NMUF = ? " +                    
                                       "WHERE CODCLIENTE = ? ");
            
            pst.setString(1, cadCliente.getNmCliente());
            pst.setString(2, cadCliente.getNmEndereco());
            pst.setString(3, cadCliente.getNmBairro());
            pst.setString(4, cadCliente.getNmCidade());
            pst.setString(5, cadCliente.getNmUF());
            pst.setInt(6, cadCliente.getCodCliente());
            pst.executeUpdate();   
            return true;                            
        } 
        catch(SQLException e)
        {
            throw new RuntimeException(e);
            //FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro SQLException", e.getMessage());  
            //FacesContext.getCurrentInstance().addMessage(null, message);  
            //return false;
        }                
        finally
        {
            if (pst != null)
            {
                pst.close();
            }            
            con.close();
        }
    }

Até aqui tudo bem, a minha questão é como trabalhar com catch(SQLException e)
gostaria de mostrar o erro para usuário, quando tiver.
mas nem sei por onde começar, estou trabalhando com jsf e primefaces o cadastro q faz a atualização
usa ajax, no caso do primefaces

Então alguém tem alguma dica de como fazer tratamento de erro ?

9 Respostas

R

Bem vindo ao GUJ :slight_smile:

Por favor, sempre que for postar código, o insira entre as tags .

Fica muito mais fácil pra todo mundo ler e ajudar.

L

Você poderia encapsular a exceção em uma exceção sua e relançar para outras camadas da aplicação

D

como fazer isso ?

L

Você cria uma classe por da sua exception por exemplo: AppException que herda de Exception, e quando vc for lançar a exception coloca

throw new AppException(e);

Ao invés de lançar a RunTimeException. dai no seu controller vc trata da melhor forma para exibi-la na tela.

L

Daí no seu bean poderia tratar essa exceção e jogar um facesMessage para enviar a mensagem para a tela.

D

ok…

mas como enviar a mensagem para a tela ?

pq estou gerando uma exceção neste método, para testar, mas não mostra na tela, e quando eu debugo cai dentro do catch

mas não mostra o erro na tela…

o q pode ser ?

L

Cria a sua exceção.
Na tela você faz um catch para a sua excecao.
Se entrar no catch cria um FaceMessage e joga para a tela.

G

amigo, segue um exemplo do que vc quer:
primeiro eu encapsulei a classe responsável por mandar a msg do faces:

package br.com.l2pog.util;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

public class ReturnMessage {
	public static final String erro = "erro";
	public static final String info = "info";
	public static final String alert = "alert";
	public static final String criticalError = "criticalError";

	public static void setMessage(String msg, String tipo) {
		if (tipo.equalsIgnoreCase("erro")) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, null));
		}
		if (tipo.equalsIgnoreCase("info")) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null));
		}
		if (tipo.equalsIgnoreCase("alert")) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, msg, null));
		}
		if (tipo.equalsIgnoreCase("criticalError")) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_FATAL, msg, null));
		}
	}
}

ou seja, add essa classe no seu projeto, para mandar exibir uma msg na tela vc teria de chamar a classe ReturnMessage.setMessage(“msg que o cara vai receber”, “tipo de erro”);
na sua camada de visão vc colocaria um método como o abaixo no seu MB:

package br.com.l2pog.controller.managedbean;

import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.apache.commons.mail.EmailException;

import br.com.l2pog.dao.AccountDAO;
import br.com.l2pog.factory.ConnectionFactory;
import br.com.l2pog.model.Account;
import br.com.l2pog.util.EncryptPassword;
import br.com.l2pog.util.MailService;
import br.com.l2pog.util.MySession;
import br.com.l2pog.util.ReturnMessage;

@ManagedBean
@ViewScoped
public class AlterPasswordMB implements Serializable {
	private static final long serialVersionUID = 1L;
	private final String message = "Senha alterada com sucesso!\n";
	private final String subject = "Alteração de senha L2POG";
	private String password;
	private String newPassword;

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getNewPassword() {
		return newPassword;
	}

	public void setNewPassword(String newPassword) {
		this.newPassword = newPassword;
	}

	public void update() {
		if (validateParameters()) {
			try {
				Connection connection = ConnectionFactory.getInstance();

				try {
					UserMB myUser = (UserMB) MySession.getMB("userMB",
							UserMB.class);
					Account acc = new Account();
					acc.setLogin(myUser.getAcc().getLogin());
					acc.setPassword(EncryptPassword
							.encryptMyPassword(newPassword));
					AccountDAO daoAcc = new AccountDAO(connection);
					daoAcc.update(acc);
					reportChanges(acc, myUser.getAcc().getUser().getUserMail());
					password = "";
					newPassword = "";
					ReturnMessage.setMessage("Senha alterada com sucesso!",
							"info");
				} catch (SQLException e) {
					ReturnMessage.setMessage("Erro ao tentar alterar a senha: "
							+ e.getMessage(), "criticalError");
				} catch (NoSuchAlgorithmException e) {
					ReturnMessage.setMessage("Erro ao tentar alterar a senha: "
							+ e.getMessage(), "criticalError");
				} catch (EmailException e) {
					ReturnMessage.setMessage("Senha alterada com sucesso! "
							+ "Mas houve um erro ao tentar enviar o email: "
							+ e.getMessage(), "alert");
				} catch (Exception e) {
					ReturnMessage.setMessage("Erro ao tentar alterar a senha: "
							+ e.getMessage(), "criticalError");
				}

			} catch (SQLException e) {
				ReturnMessage.setMessage(
						"Erro ao estabelecer conexão para alterar senha: "
								+ e.getMessage(), "criticalError");
			}

		}

	}
}

repare que aí eu fiz exatamente o que vc está precisando, eu chamei o meu dao e no catch eu trato a exceção lançando a minha msg e informando o tipo de erro, crítico.
caso ocorra tudo bem, então eu dou uma msg de ok e coloco no formato de info.

agora na sua página xhtml vc terá algo como isso para fazer a chamada:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
</h:head>
<h:body
	style="background: url('#{alterBackgroundImageMB.urlEnd}') no-repeat;">
	<h:form id="formRegistro">
		<p:growl id="messagesGrowl" /> <!-- esse componente é o responsável por renderizar a msg que nós colocamos no ReturnMessage.setMessage lá no MB. -->
<div style="width: 25%">
		<h:panelGrid columns="2">
			<h:outputText style="color:white" value="Senha:" />
			<p:password value="#{alterPasswordMB.password}" maxlength="19"
				minLength="4" promptLabel="Informe a senha" weakLabel="fraca"
				goodLabel="média" strongLabel="forte" />

			<h:outputText style="color:white" value="Nova Senha:" />
			<p:password value="#{alterPasswordMB.newPassword}" maxlength="19"
				minLength="4" promptLabel="Informe a senha" weakLabel="fraca"
				goodLabel="média" strongLabel="forte" />

		</h:panelGrid>
		<p:captcha id="captcha" label="Captcha" theme="blackglass"
			language="pt" requiredMessage="favor preencher o captcha"
			validatorMessage="texto incorreto, preencha corretamente" />
		<h:commandButton action="#{alterPasswordMB.update}" value="Cadastrar" /> <!-- aqui eu faço a chamada para o meu MB -->
</div>
	</h:form>
</h:body>
</html>

repare no <p:growl id=“messagesGrowl” /> é ele o carinha que vai mostrar a sua msg.
é isso aí, colega. qualquer dúvida diga aí que lhe ajudamos. :lol:

D

[size=18]Muito obrigado a todos e a todas as respostas, acredito que com todo esse empenho de vcs em achar uma solução para o meu problema irei solucioná-lo.

Muito obrigado
[/size]

Criado 29 de junho de 2012
Ultima resposta 30 de jun. de 2012
Respostas 9
Participantes 5