Try dentro do outro

2 respostas
P

Bom dia Pessoal,

Estou com uma dúvida eu faço uma conexão com o banco para ler alguns registros, 1543 para ser exato, e faço uma conexão com um outro banco para pegar a descrição dos produtos lido na primeira tabela, mas nesta segunda tabela posso não ter o registro para o código achado na primeira então no segundo catch eu trato este erro mas quando ele entra no segunto catch da erro no primeiro também, coloquei o system.out para acompanhar aí aparece o outro no primeiro catch e logo em seguida aparece o entrou no segundo catch, vejam o código para ficar mais claro:

public static String PegaProdutos() { 
        int quantReg = 0;
        produtos = new Produtos();
                
        try {                        
            pstProgress = executaSqlEspec("select \"it-codigo\" from PUB.\"scq-param5\" with (nolock)" );            
            rsProgress = pstProgress.executeQuery();
            //---------------------------			
            while (rsProgress.next()) {                                
                System.out.println(rsProgress.getString("it-codigo") + " " + quantReg++);
                try {                    
                    pstEms2mult = executaSqlEms2mult("select \"it-codigo\", \"desc-item\" from PUB.item where PUB.item.\"it-codigo\" = \'" 
                                            + rsProgress.getString("it-codigo") + "\' with (nolock)" );            
                    rsEms2mult = pstEms2mult.executeQuery();
                    while (rsEms2mult.next()){
                        produtos.setProduto(rsProgress.getString("it-codigo"), rsEms2mult.getString("desc-item"));                   
                    }
                    rsEms2mult.close();
                    pstEms2mult.close();
                    conexaoEms2mult.close();
                    conexaoEms2mult = null;
                }catch (Exception ex1) {
                    System.out.println("entrou no primeiro catch");
                    produtos.setProduto(rsProgress.getString("it-codigo"), "Sem Cadastro");
                    //JOptionPane.showMessageDialog(null,"Produto: " + rsProgress.getString("it-codigo") + " sem cadastro. Verifique.");
                }
            }
            System.out.println("sai do while...");
            rsProgress.close();
            pstProgress.close();
            conexaoEspec.close();
            conexaoEspec = null;                        
        } catch (Exception ex2) {
            System.out.println("entrou no segundo catch...");
            JOptionPane.showMessageDialog(null,"Ocorreu um erro na conexão com o banco de dados. Verifique." + ex2.getMessage());
        }         
        return null;
    }

Saberiam se existe uma forma de tratar isso para não entrar no segundo catch quando da erro no primeiro?

2 Respostas

A

Olha, para facilitar sua vida, você poderia definir seu código da seguinte maneira:

public static String pegaProdutos() { 
  
    produtos = new Produtos();
    List<Integer> todosSqcParams = pegaTodosSqcParams();
    for(Integer sqcParam : todosSqcParams) {
        List<String> descricoes = pegaTodasDescricoesPorSqc(sqcParam);
        if ( descricoes.isEmpty() ) {
          produtos.setProduto(sqcParam, "Sem Cadastro");
        } else {
            for(String descricao : descricoes) {
                produtos.setProduto(sqcParam, descricao);
            }
        }
        
    }
  }

Mude o código desse método para dentro dos métodos pegaTodosSqcParams e pegaTodasDescricoesPorSqc que vai ficar mais simples de você entender o que tá acontecendo.

Agora, tem vários smells nesse seu código, vários mesmo.
Se quiser umas dicas de como melhorar isso aí, pergunte aqui.

P

Muito obrigado AbelBueno,

Vou tentar implementar da maneira indicada, na verdade já tinha alterado algumas coisas, percebi que o erro acontecia não porque não era encontrado o produto com o código procurado, só não sei porque acontecia, veja como esta agora:

public static String PegaProdutos(){ 
        int quantReg = 0;
                       
        produtos = produtos.getInstance();
        
        try {                        
            pstProgress = executaSqlEspec("select \"it-codigo\" from PUB.\"scq-param5\" with (nolock)" );            
            rsProgress = pstProgress.executeQuery();
            //---------------------------			
            while (rsProgress.next()) {                                                
                produtos.setProduto(rsProgress.getString("it-codigo"), "Sem Desc", 9999999);                
            }            
            rsProgress.close();
            pstProgress.close();
            conexaoEspec.close();
            conexaoEspec = null;                        
        } catch (Exception ex2) {            
            JOptionPane.showMessageDialog(null,"Ocorreu um erro na conexão com o banco de dados. Verifique." + ex2.getMessage());
        }       

        for (int vi = 0; vi < produtos.getQuantProdutos();vi++){
            try {                                    
                pstEms2mult = executaSqlEms2mult("select \"it-codigo\", \"desc-item\" from PUB.item where PUB.item.\"it-codigo\" = \'" 
                                        + produtos.getItCodigo(vi) + "\' with (nolock)" );            
                rsEms2mult = pstEms2mult.executeQuery();
                while (rsEms2mult.next()){                    
                    produtos.setProduto(produtos.getItCodigo(vi), rsEms2mult.getString("desc-item"), vi);                   
                }                
                rsEms2mult.close();                                
            }catch (Exception ex1) {                
                produtos.setProduto(produtos.getItCodigo(vi), "Não foi encontrado cadastro p/ o código do produto", vi);                
            }            
        }
        
        try{
            pstEms2mult.close();            
            conexaoEms2mult.close();
            conexaoEms2mult = null;                
        }catch(Exception ex3){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro ao fechar conexão com o banco de dados. Verifique." + ex3.getMessage());
        }
        
        return null;
    }

Quanto aos smells pode ficar a vontade de me indicar, pois estou iniciando agora com Java e seria de muita ajuda ter este auxílio de uma pessoa mais experiente, trabalho a muito tempo com outra linguagem e a adaptação com o Java não esta sendo fácil.

Muito obrigado mais uma vez.

Criado 5 de junho de 2015
Ultima resposta 9 de jun. de 2015
Respostas 2
Participantes 2