Excessão com comportamento estranho

2 respostas
marcioa1
Tenho o seguinte método :
public synchronized static void fechaDocumento() throws IOException{
			document.close();
			arquivoPDFAberto = false;
	}
que é chamado por
try{

ImprimeExtrato.fechaDocumento();

} catch (IOException e){
	listaDeErros.add(codigoDoPrestador+"-"+e);
}

Mas, mesmo assim , ele lança a excessão no cosole:

Exception in thread "Thread-3" ExceptionConverter: java.io.IOException: The document has no pages.
	at com.lowagie.text.pdf.PdfPages.writePageTree(Unknown Source)
	at com.lowagie.text.pdf.PdfWriter.close(Unknown Source)
	at com.lowagie.text.pdf.PdfDocument.close(Unknown Source)
	at com.lowagie.text.Document.close(Unknown Source)
	at negocio.ImprimeExtrato.fechaDocumento(ImprimeExtrato.java:959)
	at acoes.ControlaTela.imprimeFaixa(ControlaTela.java:448)
	at acoes.ControlaTela.run(ControlaTela.java:490)
	at java.lang.Thread.run(Thread.java:595)

Por que não consigo capturar e tratar a excessão como codifiquei ?

Márcio

2 Respostas

Rafael_Steil

O problema eh que voce esta executando o codigo que lanca a exception em uma thread e tratando a exception em outra thread. No caso, voce tera que lidar com a exception diretamente no fechaDocumento(). O exemplo abaixo prova isso:

class TesteRun implements Runnable {
	public void run() {
		throw new RuntimeException("erro erro");
	}
}

public class Teste {
	public static void main(String[] args) {
		try {
			new Thread(new TesteRun()).start();
		}
		catch (RuntimeException e) {
			System.out.println("Peguei o erro: " + e);
		}
	}
}

Rafael

Rafael_Steil

Uma opcao meio bizarra eh vc criar um ThreadGroup especialmente para lidar com a situacao:

class TesteRun extends Thread {
	public TesteRun(String name) {
		super(new DummyThreadGroup("worker"), name);
	}

	public void run() {
		throw new RuntimeException("erro erro");
	}
}

class DummyThreadGroup extends ThreadGroup {
	public DummyThreadGroup(String s) {
		super(s);
	}

	public void uncaughtException(Thread thread, Throwable t) {
		System.out.println("Thread " + thread.getName() + " died. " + t);
	}
}

public class Teste {
	public static void main(String[] args) {
		new TesteRun("minha thread").start();
	}
}

Mas talvez nao seja a melhor escolha para voce (aka, analise bem)

Rafael

Criado 24 de junho de 2005
Ultima resposta 24 de jun. de 2005
Respostas 2
Participantes 2