terça-feira, 9 de outubro de 2012

Estrutura try..finally

O controle de exceções é um recurso fundamental na Programação Orientada a Objetos. Geralmente usamos o famoso try..catch para controlar as exceções no Java ou em outras linguagens que adotam a POO (com notações levemente diferentes).

// try..catch em Java
try {
  ...
} catch (Exception e) {
  ...
}

Mas, geralmente, quando estamos criando métodos, muitas vezes queremos que as exceções sejam lançadas para fora, assim usamos o try..catch e relançamos a exceção no bloco catch. Acho que isso não é nenhuma surpresa.

// relançando a exceção
try {
  ...
} catch (Exception e) {
  throw e;
}

No entanto, há momentos em que estamos trabalhando com algo sensível, como abrindo arquivos, abrindo conexão com banco de dados, criando arquivos temporários, entre outros, que precisamos usar o bloco finally, mas ao mesmo tempo queremos que a exceção seja relançada, daí normalmente usamos o bloco try..catch..finally. Isso também não deve ser nada novo.

// try..catch..finally
try {
  ...
} catch (Exception e) {
  throw e;
} finally {
  file.delete()
}

A surpresa, para mim, pelo menos, foi que também existe o bloco try..finally, sem o catch, mas que funciona da mesma forma que esse último. Claro considerando que dentro do catch só haja a instrução de relançamento da exceção.

// try..finally
try {
  ...
} finally {
  file.delete()
}

Por fim, acredito que muitas outras linguagens também permitem utilizar esse "atalho". Ao menos no Python funciona, testei e comprovei.

2 comentários:

  1. Try...catch é bom para proteger contra erro, mt bom.

    ResponderExcluir
  2. É verdade, mas se ligue que o try..finally não protege contra erros. Como foi dito, é uma forma de relançar a exceção sem perder a possibilidade de executar um "finalmente".

    ResponderExcluir