Try catch

10 respostas
E

pessoal,

como fazer para uma função só ser executada caso um outra função tenha sido executada com sucesso?

Por Exemplo:

Tenho a quatro funções para serem executadas, porém todas elas tem que ser realizadas sem erros.
Se em uma das quatro funções ocorrer algum errro, as demais funções devem ser abortadas.

public static void main(String[] args) { try{ funcaoUm(); funcaoDois(); funcaoTres(); funcaoQuatro(); }cath(Exception e){ } }

Obrigado pela ajuda.

10 Respostas

marcelogds

Vc pode usar um throws para cada função. Tipo:

public void funcaoUm() throws Exception{

}

Assim a aplicação é interrompida quando ocorre algum erro na função

fabim

Acho que nao e isso que ele quer.

Pelo que eu entendi, ele quer uma especie de “transaction”, de maneira que mesmo que se execute com sucesso 1, 2 e 3, mas o 4 falhe, de uma especie de ‘rollback’ no 1 2 e 3.

J

Se der erro no 4ª metodo voce quer abortar o primeiro,segundo e terceiro tbm? Ou
Se der erro em algum dos metodos so nao executa o que vier abaixo?

Se for o ultimo…é so em cada metodos(funcao) você encaminha a Excessão para o chamdador com o throws
Agora se for o primeiro caso…ai tem que ver o que voce esta fazendo em cada um dos metodos…por exemplo se estiver salvando dados em um
Banco de Dados…ai voce tem que iniciar a transacao e so dar o comit apos o 4º metodo ser executado com sucesso…

T+

Vini_Fernandes

Cara, sugiro a voce que na implementacao das suas funcoes voce retorne um boolean para o caso em que as funcoes sejam executadas corretamente, por exemplo: o metodo add() da java.util.List. Assim, voce tera:

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

boolean ok = funcaoUm();
if(ok){
  ok = funcaoDois();
  if(ok)
    funcaoTres();
}

A ordem de execucao entre as funcoes um, dois e tres será de acordo com sua logica!

Abracao

E

Blz Vini…
Acho que essa foi uma boa solução.
Obrigado.
Abraço.

Vini_Fernandes

Temos um problema na minha proposta, o fato é que se o metodo funcaoTres() nao seja executado como deseja voce nao tera como dar um rollback nas funcaoes anteriores!

abracao

ggarnier

Vini Fernandes:
Cara, sugiro a voce que na implementacao das suas funcoes voce retorne um boolean para o caso em que as funcoes sejam executadas corretamente, por exemplo: o metodo add() da java.util.List. Assim, voce tera:

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

boolean ok = funcaoUm();
if(ok){
  ok = funcaoDois();
  if(ok)
    funcaoTres();
}

A ordem de execucao entre as funcoes um, dois e tres será de acordo com sua logica!

Abracao

Ou então assim:

boolean ok = (funcaoUm() && funcaoDois() && funcaoTres());
Felagund

[quote=ggarnier]

Vini Fernandes:
Cara, sugiro a voce que na implementacao das suas funcoes voce retorne um boolean para o caso em que as funcoes sejam executadas corretamente, por exemplo: o metodo add() da java.util.List. Assim, voce tera:

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

boolean ok = funcaoUm();
if(ok){
  ok = funcaoDois();
  if(ok)
    funcaoTres();
}

A ordem de execucao entre as funcoes um, dois e tres será de acordo com sua logica!

Abracao

Ou então assim:

boolean ok = (funcaoUm() && funcaoDois() && funcaoTres());

assim do seu jeito so vai dizer se as funções foram executadas com sucesso, mas não é bem isso que ele quer
eu prefiro aglo mais DRY

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

if(funcaoUm()){
  if(funcaoDois){
    funcaoTres();
  }
}

assim economiza código e variaveis.

ggarnier

[quote=Felagund]

ggarnier:
Vini Fernandes:
Cara, sugiro a voce que na implementacao das suas funcoes voce retorne um boolean para o caso em que as funcoes sejam executadas corretamente, por exemplo: o metodo add() da java.util.List. Assim, voce tera:

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

boolean ok = funcaoUm();
if(ok){
  ok = funcaoDois();
  if(ok)
    funcaoTres();
}

A ordem de execucao entre as funcoes um, dois e tres será de acordo com sua logica!

Abracao

Ou então assim:

boolean ok = (funcaoUm() && funcaoDois() && funcaoTres());

assim do seu jeito so vai dizer se as funções foram executadas com sucesso, mas não é bem isso que ele quer
eu prefiro aglo mais DRY

public boolean funcaoUm(){//corpo do metodo};
public boolean funcaoDois(){//corpo do metodo}
public boolean funcaoTres(){//corpo do metodo}

if(funcaoUm()){
  if(funcaoDois){
    funcaoTres();
  }
}

assim economiza código e variaveis.

Não entendi. As duas soluções (usando && e usando if) fazem exatamente a mesma coisa. Só coloquei o boolean ok na frente p/ poder verificar se todas as funções tiveram sucesso.

peczenyj

Existem varias formas de fazer isso.

  • Vc pode sinalizar que falhou lançando uma Exception

  • Vc pode retornar sucesso ou falha e, então, aninhar ifs e elses para executar a proxima instrução

  • O procedimento pode sinalizar qual é , ou invocar diretamente, o proximo procedimento

  • Vc pode criar um algoritmo generico para executar todos os procedimentos (que podem ser definidos num xml, adicionados numa collection ou mesmo usando alguma anotação que vc criou) e parar quando um não se comportar da forma esperada. O JUnit funciona dessa forma, porem vc tem que pensar na ordem de execução.

Criado 9 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 10
Participantes 8