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