Relançar Exceção

14 respostas
guilhermetk

Olá pessoal, eu tenho o seguinte método:

public void setValuesView(final Equipamento equipamento, final boolean equipamentoRespondendo, final ICiaViewControl control) throws PluginException { if (res == null && reseting == false) { res = new br.ind.cianet.hpn3602.gui.Resetando("Atualizando Variáveis HPNA...", control.getCiaViewGUI()); res.executaBarra(); Thread t = new Thread(new Runnable() { @Override public void run() { try { test(equipamento, equipamentoRespondendo, control); } catch (PluginException e) { e.printStackTrace(); } } }); t.start(); } else { test(equipamento, equipamentoRespondendo, control); } }

O que eu preciso fazer é que a exceção PluginException que é capturada dentro da thread, seja relançada para que quem chame o método possa tratá-la. É possível fazer isso?

Obrigado desde já.

[]'s

Guilherme

14 Respostas

Alexandre_Saudate

As exceptions da JDK têm essa capacidade, vc pode encapsular umas em outras. só fazer

throw new RuntimeException(minhaException);
guilhermetk

Me desculpe, mas não entendi o que isto faz.

nel

Boa tarde.

Pelo o que eu entendi é simplesmente isto que você quer:

try { test(equipamento, equipamentoRespondendo, control); } catch (PluginException e) { //e.printStackTrace(); throw e; }

O printStackTrace() simplesmente “imprimi” na tela o erro, pelo o que eu entendi, você queria que fosse lançada esta excessão para quem estiver invocando este método e assim possa trata-la, dando o throw e você está lançando esta Excessão adiante, podendo trata-la quando invocar este método.

Abraços.

guilhermetk

Eu já tentei isso. Acusa este erro: “Unhandled exception type PluginException” e sugere um “Surround with try/catch”.

Hellmanss

Tens que declarar que esse metodo lança essa exceção, para que chama-lo poder saber que ele a lança!

public void fazAlgo() throws Exception{ }

nel

Você chama o método test e não usa um try-catch para ele.
Tente assim:

if (res == null && reseting == false) { res = new br.ind.cianet.hpn3602.gui.Resetando("Atualizando Variáveis HPNA...", control.getCiaViewGUI()); res.executaBarra(); Thread t = new Thread(new Runnable() { @Override public void run() { test(equipamento, equipamentoRespondendo, control); } }); t.start(); } else { test(equipamento, equipamentoRespondendo, control); } } catch (PluginException e) { throw e; }

nel

Hellmans, ele faz isso veja:

public void setValuesView(final Equipamento equipamento, final boolean equipamentoRespondendo, final ICiaViewControl control) throws PluginException {//código }

:slight_smile:

sergiotaborda

guilhermetk:
Olá pessoal, eu tenho o seguinte método:

public void setValuesView(final Equipamento equipamento, final boolean equipamentoRespondendo, final ICiaViewControl control) throws PluginException { if (res == null && reseting == false) { res = new br.ind.cianet.hpn3602.gui.Resetando("Atualizando Variáveis HPNA...", control.getCiaViewGUI()); res.executaBarra(); Thread t = new Thread(new Runnable() { @Override public void run() { try { test(equipamento, equipamentoRespondendo, control); } catch (PluginException e) { e.printStackTrace(); } } }); t.start(); } else { test(equipamento, equipamentoRespondendo, control); } }

O que eu preciso fazer é que a exceção PluginException que é capturada dentro da thread, seja relançada para que quem chame o método possa tratá-la. É possível fazer isso?

Não. Não é possivel.
A razão é simples. não ha passagem de exceções entre threads. A thread que executa o método e a que executa run() não são a mesma. Portanto não dá.

O método run da thread é um limite superior. Não ha para onde mandar essa exception mais (além do exception handler de cada thread).

A solução é mandar para o sistema de log/tratamento de exceções e pronto.

M

Isso pois você implementa Runnable e o método run() não lança exceção alguma (isso por causa da definição na interface).

O que você pode fazer é lançar uma exceção que extende RuntimeExcetion (exceção não checada) que encapsula seu PluginException.

Crie uma classe RuntimePluginException:

public class RuntimePluginException extends RuntimeException {
                                                       
	private static final long serialVersionUID = 1L;   
                                                       
	public RuntimePluginException(Exception e) {       
		super(e);                                      
	}                                                  
                                                       
}

E faça isso no seu método.

try {   
       test(equipamento, equipamentoRespondendo, control);   
} catch (PluginException e) {   
    throw new RuntimePluginException(e);
}

Aí você deve, em algum lugar da aplicação, tratar este RuntimePluginException. Acho que isso resolve.

nel

A minha dúvida foi respondida pelo Sergio, depois que olhei atentamente seu código percebi que utiliza Thread e a dúvida surigu, bem, acredito que o esclarecimento foi de bom tamanho.

Abraços.

guilhermetk

Obrigado a todos pelo esclarecimento. Tentarei implementar a solução que o marcobiscaro2112 sugeriu.

[]'s

Guilherme

sergiotaborda

marcobiscaro2112:
Isso pois você implementa Runnable e o método run() não lança exceção alguma (isso por causa da definição na interface).

Existe uma razão para isso. É porque nenhuma exceção deve ser lançada por run().
Mesmo que vc encapsule em um runtimeexception essa exceção vai cair no excetion handler da thread. Nunca vai voltar ao método que originalmente lançou a thread.

O conceito de stacktrace é por thread.

M

sergiotaborda:
marcobiscaro2112:
Isso pois você implementa Runnable e o método run() não lança exceção alguma (isso por causa da definição na interface).

Existe uma razão para isso. É porque nenhuma exceção deve ser lançada por run().
Mesmo que vc encapsule em um runtimeexception essa exceção vai cair no excetion handler da thread. Nunca vai voltar ao método que originalmente lançou a thread.

O conceito de stacktrace é por thread.


Exatamente. Logo, a minha sugestão não funciona (e nem há como fazer).

sergiotaborda

marcobiscaro2112:
sergiotaborda:
marcobiscaro2112:
Isso pois você implementa Runnable e o método run() não lança exceção alguma (isso por causa da definição na interface).

Existe uma razão para isso. É porque nenhuma exceção deve ser lançada por run().
Mesmo que vc encapsule em um runtimeexception essa exceção vai cair no excetion handler da thread. Nunca vai voltar ao método que originalmente lançou a thread.

O conceito de stacktrace é por thread.


Exatamente. Logo, a minha sugestão não funciona (e nem há como fazer).

:slight_smile:

Ha como fazer sim … mas na prática não se faz.
A razão é porque não é correto 99,9999% das vezes.

Para funcionar vc precisa declarar um exception handler aninhados no método, e criar um mecanismo de sincronismo. A maior parte das vezes isso é o mesmo que não usar a thread para começo de conversa o que é muito mais simples.

Em frameworks como o Executor ou o novo ParallelArray do Java 7 este tipo de coisas é importante e não pode ser esquecido, mas o desenvolvedor do dia a dia não precisa se preocupar com isso…

Criado 23 de dezembro de 2009
Ultima resposta 23 de dez. de 2009
Respostas 14
Participantes 6