Dando continuidade bloco try/catch depois de gerar exception[RESOLVIDO]

7 respostas
jeloy

Boa noite!

Estou com uma duvida besta eu acho hehe…

tenho um loop for onde eu percorro um array executando metodos para cada um deles…

dentor do loop tem um bloco/trycatch. Quando ocorre uma exception em 1 item do array ele para de fazer o loop.

Eu gostaria que se desse uma exception ele continuasse na prox array!

como eu faria isso?

segue minha classe

int  tamanhoList = listArq.getModel().getSize();
        String[] listArquivos = new String[tamanhoList];
        for (int i = 0; i < listArquivos.length; i++) {
            listArquivos[i] = listArq.getModel().getElementAt(i).toString();

            try {
                try {
                Nfs nf = ler.lerNF(new File(listArquivos[i]));
                // Cria channel na origem
                FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();
                // Cria channel no destino
                FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();
                // Copia conteúdo da origem no destino
                destChannel.transferFrom(oriChannel, 0, oriChannel.size());
                ftp.transmite("d:\temp\"+nf.getPath()+".xml");
                // Fecha channels
                oriChannel.close();
                destChannel.close();

                dao.gravar(nf);

                File del = new File("d:\temp\"+nf.getPath()+".xml");
                del.deleteOnExit();
                } catch (Exception e) {
//parou no catch "/
                 }

7 Respostas

d34d_d3v1l

finally?

discorpio

Boa noite a todos.

Que tal voce utilizar o finally assim:

int  tamanhoList = listArq.getModel().getSize();  
        String[] listArquivos = new String[tamanhoList];  
        for (int i = 0; i < listArquivos.length; i++) {  
            listArquivos[i] = listArq.getModel().getElementAt(i).toString();  
            try {  
                      Nfs nf = ler.lerNF(new File(listArquivos[i]));  
                      // Cria channel na origem  
                      FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();  
                      // Cria channel no destino  
                      FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();  
                      // Copia conteúdo da origem no destino  
                     destChannel.transferFrom(oriChannel, 0, oriChannel.size());  
                     ftp.transmite("d:\temp\"+nf.getPath()+".xml");  
                     // Fecha channels  
                     oriChannel.close();  
                     destChannel.close();  
                     dao.gravar(nf);  
  
                     File del = new File("d:\temp\"+nf.getPath()+".xml");  
                     del.deleteOnExit();  
            } catch (Exception e) {  
                     e.printStackTrace();
                     JOptionPane.showMessageDialog(null, e.getMessage());  
            } finally {
                     continue;
            }
      }

O bloco finally é um bloco protegido que garante a execução do programa havendo exceção ou não e a instrução continue desvia o fluxo de execução para a próxima interação do loop for

d34d_d3v1l

perfeita explicação discorpio … Obrigado por contribuir,

e peço desculpas se minha resposta foi um tanto quanto inútil =x

abraços

jeloy

Muito bom, as vezes meio besta pra uns hehe…

@d34d_d3v1l valeu sua resposta nao foi inutil nao hehe

outra coisa, eu fiz o teste aqui e deu certo…

porém nao tem como eu pegar quais posições deram certo e quais não deram?

discorpio

d34d_d3v1l:
perfeita explicação discorpio … Obrigado por contribuir,

e peço desculpas se minha resposta foi um tanto quanto inútil =x

abraços

Olá d34d_d3v1l

Não achei a sua resposta inútil. Curta ou pequena talvez, mas não inútil.

Lembre-se de que as grandes profecias, poesias, frases já proferidas por personagens da história antiga, média, moderna e conteporânea, não são aquelas que estão em extensas palavras e frases. mas sim são aquelas que apesar de curtas, expressam uma grande profundidade de sentimentos.

Você quer um exemplo.

discorpio

jeloy:
Muito bom, as vezes meio besta pra uns hehe…

@d34d_d3v1l valeu sua resposta nao foi inutil nao hehe

outra coisa, eu fiz o teste aqui e deu certo…

porém nao tem como eu pegar quais posições deram certo e quais não deram?

Olá Jeloy.

Neste caso voce terá que colocar dentro do bloco try…catch um outro tratamento de exceção que é o IOException, que reporta erro no caso de haver um erro com FileInputStream.

Ué :!: :!: :!:

Eu posso fazer mais de um tratamento de exceção dentro do bloco try…catch :?: :?: :?:

Sim. Eis o exemplo.

int  tamanhoList = listArq.getModel().getSize();    
String[] listArquivos = new String[tamanhoList];    
for (int i = 0; i < listArquivos.length; i++) {    
    listArquivos[i] = listArq.getModel().getElementAt(i).toString();    
    try {    
              Nfs nf = ler.lerNF(new File(listArquivos[i]));    
              // Cria channel na origem    
              FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();    
              // Cria channel no destino    
              FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();    
              // Copia conteúdo da origem no destino    
             destChannel.transferFrom(oriChannel, 0, oriChannel.size());    
             ftp.transmite("d:\temp\"+nf.getPath()+".xml");    
             // Fecha channels    
             oriChannel.close();    
             destChannel.close();    
             dao.gravar(nf);    
  
             File del = new File("d:\temp\"+nf.getPath()+".xml");    
             del.deleteOnExit();
    } catch (IOException ioe) {
             ioe.printStackTrace();
             JOptionPane.showMessageDialog(null, "Deu zebra na posição "+ i + ", o erro é " + ioe.getMessage();    
    } catch (Exception e) {    
             e.printStackTrace();  
             JOptionPane.showMessageDialog(null, e.getMessage());    
    } finally {  
             continue;  
    }
 }

Não se esqueça de que o bloco finally continua mesmo assim garantindo a execução do código mesmo que tenha mais de uma exceção tratada e ao contrário dos blocos “catch” voce só pode ter um bloco “finally” por cada par de bloco try

Existem também outras exceções que voce pode tratar no código acima, que são “NullPointerException” e o “FileNotFoundException”.

Todas estas classes de exceção herdam (Extends) de Exception

dudaskank

Bom, na verdade você não precisa daquele finally ali, pois em seguida do try ele já volta para o laço for. Aliás, não precisa de dois try seguidos. O que deve estar acontecendo no seu caso é aquele trecho fora do try {} catch() {} que deve estar causando algum problema. Coloque ele pra dentro do bloco try.

listArquivos[i] = listArq.getModel().getElementAt(i).toString();

Para você saber quais índices deram problema, você captura as Exceptions e trata-as adequadamente, e aproveita e adiciona o índice em uma lista. Fiz um exemplo aqui, ele tem o laço for e dentro o try/catch, e depois mostra quais deram errado depois.

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TesteForException {
	public static void main(String[] args) {
		List<Integer> problemas = new ArrayList<Integer>();
		Random random = new Random();
		for (int i = 0; i < 20; i++) {
			try {
				if (random.nextBoolean()) {
					throw new Exception("Erro na posição " + i);
				}
				System.out.println("OK na posição " + i);
			} catch (Exception e) {
				System.out.println(e);
				problemas.add(i);
			}
		}
		System.out.println("Problemas ocorreram com os seguintes itens: " + problemas.toString());
	}

}

A saída que tive foi assim:

OK na posição 0
OK na posição 1
java.lang.Exception: Erro na posição 2
java.lang.Exception: Erro na posição 3
OK na posição 4
java.lang.Exception: Erro na posição 5
OK na posição 6
OK na posição 7
OK na posição 8
OK na posição 9
java.lang.Exception: Erro na posição 10
java.lang.Exception: Erro na posição 11
OK na posição 12
OK na posição 13
java.lang.Exception: Erro na posição 14
java.lang.Exception: Erro na posição 15
OK na posição 16
java.lang.Exception: Erro na posição 17
OK na posição 18
OK na posição 19
Problemas ocorreram com os seguintes itens: [2, 3, 5, 10, 11, 14, 15, 17]

abraços e boa sorte

Criado 4 de fevereiro de 2011
Ultima resposta 5 de fev. de 2011
Respostas 7
Participantes 4