Problemas com Exceções nas Servlets

2 respostas
A

Tenho a seguinte Servlet que quero fazer um insert no banco atraves do JDBC.

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException{
        
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        String nome = request.getParameter("nome");
        double preco = Double.parseDouble(request.getParameter("preco"));
        int quantidade = Integer.parseInt(request.getParameter("quantidade"));
        
        Produto prod = new Produto(codigo,nome,preco,quantidade);

        try{
            ProdutoBD prodBD = new ProdutoBD();
            prodBD.gravaCarro(prod);
            System.out.println("Produto Gravado com Sucesso");
        }catch(ErroBD e){
            e.printStackTrace();
            System.out.println("Catch cadastra\n"+e.getMessage());
            response.sendRedirect("Erro");
        }catch(SQLException e){
            e.printStackTrace();
            System.out.println("Catch cadastra\n"+e.getMessage());
            response.sendRedirect("Erro");
        }



        request.setAttribute("produto", prod);

        RequestDispatcher rd;
        rd = request.getRequestDispatcher("/SituacaoProduto");
        rd.forward(request, response);
  }

        
        }

Caso ocorra um erro na classe ProdutoBD (uma exceção do tipo SQLException) quero redirecionar para uma pagina html com uma mensagem padrão dizendo que
houve um erro.

public class ProdutoBD {

    Connection conexao = null;


    /**
     * Método Construtor responsavel em instanciar o drive de conexao com o banco de dados
     *
     */
    public ProdutoBD() throws SQLException{

        try{
		 Class.forName("com.mysql.jdbc.Driv");

		}catch(Exception erro){
                    erro.printStackTrace();
                    throw new ErroBD("Erro na instanciação do Driver");
                }
    }

    public void criaConexao() throws SQLException{

            try{

              //Defina o database que você usará
              //Defina seu usuario e sua senha
                    conexao = DriverManager.getConnection(
                                    "jdbc:mysql://localhost:3306/teste",
                                    "root",
                                    "");
            }catch(SQLException  erro){
                    erro.printStackTrace();
                    //força a geração de uma exceção
                    //personalizada
                    throw new ErroBD("Erro ao Criar a Conexão");

            }

	}


      /**
     * Método responsável em fechar a conexao com o banco de dados
     *
     * @throws ErroBD
     */

        public void fechaConexao() throws  SQLException{
             if(conexao != null){
                 try{
                         conexao.close();
                         System.out.println("Conecção Fechada");
                 }catch (SQLException e){
                    e.printStackTrace();
                    throw new ErroBD("Erro ao Fechar a Conexão");

                 }
             }

	  }

        /**
         * Método responsável em cadastrar o carro no banco de dados
         *
         * @param car
         * @return verdadeiro caso o carro seja cadastrado com sucesso
         * @throws ErroBD
         */

        public boolean gravaCarro(Produto prod) throws SQLException{

            boolean gravou = false;

              
              PreparedStatement comando = null;
              criaConexao();

              try{

                   String sql = "insert into  Produto (idProduto, nome, preco, quantidade)  values (?,?,?,?)";
                   comando = conexao.prepareStatement(sql);

                   comando.setInt(1,prod.getCodigo());
                   comando.setString(2,prod.getNome());
                   comando.setDouble(3,prod.getPreco());
                   comando.setInt(4,prod.getQuantidade());
                   
                   gravou = comando.executeUpdate() > 0;
                   comando.close();

              }catch(SQLException e){
                  e.printStackTrace();
                  System.out.println("Passou pelo catch ProdutoBD");
                  throw new ErroBD(e.getMessage());
              }
              finally{
                fechaConexao();
                return gravou;
              }
	  }
}

Quando ocorrem Exceções nos metodos public ProdutoBD() throws SQLException e public void criaConexao() throws SQLException

o catch da minha servlet consegue pegar, mas quando tento pegar um erro do metodo public boolean gravaCarro(Produto prod) throws SQLException{
o catch da servlet não consegue pegar e não consigo redirecionar para uma pagina de erro.

O que poderia ser ?

outro problema é quando ocorrem exceções para os métodos:

etodos public ProdutoBD() throws SQLException e
public void criaConexao() throws SQLException

a servlet não redireciona para a minha pagina html à Erro.html (response.sendRedirect(“Erro”)

e sim para uma pagina padrão do TOMCAT.

Essa é minha classe ErroBD:

public class ErroBD  extends SQLException{

    public ErroBD(String mensagem){
        super(mensagem);
        System.out.println("Passou pelo catch ErroBD");
    }



}

Caso alguem possa me ensinar outra maneira de informar ao cliente no navegador que houve um erro ficarei grato.

2 Respostas

luizrobertofreitas

Olá.

Isso ocorre pq vc está tratando o SQLException dentro do método gravaCarro(). Neste caso se houver uma exceção, ela será tratada dentro do método.

Inté

A

Entendi.

Desculpe estou começando a programar em WEB, o que vc recomenda para que eu consiga mostrar uma tela de erro ? Qual seria uma forma mais adequada.
Caso possa exibir um trexo de código ficarei grato.

Criado 29 de maio de 2010
Ultima resposta 29 de mai. de 2010
Respostas 2
Participantes 2