Relançar uma exceção

11 respostas
P

Estou lendo em um livro que a gente pode relançar uma exceção, mas qual a vantagem e o que acontece quando fazemos isso

Ex:

[code]
public void dostuff() throws IOException
{
try {
//risky IO thing
}
catch (IOException ex)
{
throw ex;
}
}[code][/code]

11 Respostas

cv1

Geralmente nao tem muito sentido, mas sim, eh possivel. Ainda nao consegui pensar em um caso onde valha a pena, alias :D[/code]

brlima
public void dostuff() throws IOException{
   try {
      //risky IO thing
   }
   catch (IOException ex)
   {
      // Quero guardar o valor de uma dessas variaveis ai em cima
     
      
      // Agora quero fazer algum processamento com esses dados pra
      // depois continuar lançando a excessao
 
      throw ex;
   }
}

Acho que isso pode ser um exemplo util. :D
Tipo deletar um arquivo criado ja q deu erro, ou algo assim... Se bem que finally faz isso já, neh ?

brlima

Ou podemos fazer uma tradução da excessao, gerando a mesma excessao com nome diferente… sei lá…:smiley:

E

o problema é que relançar uma exceção dá uma coceira para :? usar essa interrupção como controle de fluxo que não é uma boa prática.

Minha dúvida é: se tenho um método que retorna um int (ou outro tipo) e esse mesmo método verifica o valor da variável e por algum motivo eu queira que ele retorne uma mensagem “o valor não pode ser maior de 12”. Sei que posso fazer retornar -1 para indicar erro, mas e se -1 for um valor de retorno válido? Retornar uma exceção seria errado, mas o qual a melhor prática?

dsiviotti

Poderia ser um registro de log seguido do relançamento da exceção para o método chamador:

public void dostuff() throws IOException{ 
   try { 
      //risky IO thing 
   } 
   catch (IOException ex) 
   { 
      // Quero guardar o valor de uma dessas variaveis ai em cima 
      
      
      // Agora quero fazer algum processamento com esses dados pra 
      // depois continuar lançando a excessao 
      setLogError("Houve um erro aqui, eu não vou tratar, quem chamou que trate!");
      throw ex; 
   } 
}
danieldestro

Definindo um método que relança uma exceção:

public boolean fazerRetidada( double valorRetirada ) throws SaldoInsuficienteException { if( saldo < valorRetirada ) { throw new SaldoInsuficienteException(); } debitarValorNaConta( valorRetirada ); return true; }

Agora, um outro trecho que código que usa aquele método e captura e trata a possível exceção:

try { fazerRetidada( 10000.0 ); } catch( SaldoInsuficienteException e ) { System.out.println( “Saldo Insuficiente para a retirada” ); }

urubatan

eu uso este tipo de coisa as vezes quando não vou tratar a excessão, ou não é competencia daquela classe tratar esta excessão, mas quero fazer um log daquela excessão com variaveis encontradas apenas localmente naquele metodo por exemplo :slight_smile:

Rafael_Steil

Colocou bem :stuck_out_tongue:

Se o log fosse mais superficial, nao teria muito sentido logar em cada try-catch, pois ficaria um monte de codigo redundante pelo sistema, sendo nesse caso mais apropriado deixar para logar no try-catch de mais alto nivel.

Rafael

rodrigousp

Fala sério …


o problema é que relançar uma exceção dá uma coceira para usar essa interrupção como controle de fluxo que não é uma boa prática.

Minha dúvida é: se tenho um método que retorna um int (ou outro tipo) e esse mesmo método verifica o valor da variável e por algum motivo eu queira que ele retorne uma mensagem “o valor não pode ser maior de 12”. Sei que posso fazer retornar -1 para indicar erro, mas e se -1 for um valor de retorno válido? Retornar uma exceção seria errado, mas o qual a melhor prática

Por que retornar uma exceção seria errado ???
Cria uma nova exceção chamado methodXOutOfRange.
quando chamar o método X, dá um surround em methodX e trata a exce~]ao methodXOutOfRange da maneira que você quiser…

Feio é retornar num específico valor do Contra-Domínio, código de erro.

dukejeffrie

Eu conheço um caso onde vc pode querer relançar uma exceção:

catch (Exception e) {
    if (e instanceof RuntimeException) throw (RuntimeException e);
    else if (!isRetryAvailable()) {
       log("all attempts exausted");
       releaseResources();
       resetTryCount();
       throw e;
    }
    else {
       log("first try failed (" + e.getMessage() + "), retrying...");
       retry();
    }
  }

Tá um pouco exagerado, mas existe.

[/code]

[]s!!

Bani

Essa idéia está no item 43 do livro Effective Java.

Criado 5 de março de 2004
Ultima resposta 7 de mar. de 2004
Respostas 11
Participantes 11