• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

dpeneireiro

Try - carch - ?finally?

4 mensagens neste tópico

Olá pessoal. A minha dúvida pode parecer muito básica mas a verdade é que nunca consegui perceber o objectivo do finally uma vez que é executado sempre, independentemente de se existiu ou não excepção...

Para mim, o bloco de código:

Try

{

  ........

  Operações a verificar

  ........

}

catch(excepção)

{

  .........

  Operações a executarcaso corra mal

  .........

}

finally

{

  ........

  Operações a executar sempre quer existam excepções ou não

  ........

}

........

Continuação do programa

........

Faz exactamente o mesmo que o bloco sem o finally.

Try

{

  ........

  Operações a verificar

  ........

}

catch(excepção)

{

  .........

  Operações a executarcaso corra mal

  .........

}

........

Operações a executar sempre quer existam excepções ou não

........

........

Continuação do programa

........

Estarei certo ou existe alguém mais sábio que eu que discorde?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, não faz, isto porque o código depois do catch pode nunca ser executado.

Isto é, nada te grante que o código seja executado após ter ocorrido uma excepção, o bloco finally é o único capaz de garantir isso, é por essa razão que ele existe.

Imagina que estás a ler de um ficheiro dentro de um bloco try, ocorre uma excepção em que precisas parar o programa como fechas o ficheiro que abriste e libertas os recursos? Se colocares o código para fechar dentro do bloco catch então o ficheiro só é fechado se ocorrer uma excepção, se colocares fora do try...catch, no fim do bloco, o ficheiro só é fechado se não ocorrer um excepção, lembra-te que o programa é parado no catch. Solução ou repetes código igual em dois locais diferentes ou usas um bloco finally. Tens código apenas num local e independentemente de ter ou não ocorrido uma exepção o ficheiro é sempre fechado.

É claro que em casos simples a tua analogia está correcta, mas isso é em casos simples, onde normalmente até se ignoram as excepções que são lançadas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há, estou a perceber. Se o programa bloquear quando existir a excepção, ou caso eu utilize o código exit dentro do bloco catch o finally é executado na mesma. É isso?

Obrigado pelo esclarecimento.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim é isso mesmo. Repara que ninguém te obriga a tratar uma excepção dentro do bloco catch, tratar e apanhar são coisas diferentes. Podes sempre querer propagar o erro para um outro objecto que por sua vez pode propagar essa excepção. A única garantia que tens de que um determinado código é sempre executado, com ou sem excepção, é usar um bloco finally, independentemente do código que é executado dentro do catch.

Posso dizer-te que uso o finally sempre que tenho recursos que preciso libertar, assim, com ou sem erros eles são sempre libertos, mas este é o meu uso mais comum, não é o único e seria muito redutor dizer que o finally só serve para isso ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora