Excessão com comportamento estranho

Tenho o seguinte método :

public synchronized static void fechaDocumento() throws IOException{
			document.close();
			arquivoPDFAberto = false;
	}

que é chamado por

[code]try{

ImprimeExtrato.fechaDocumento();

} catch (IOException e){
listaDeErros.add(codigoDoPrestador+"-"+e);
}
[/code]

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

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

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