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.