Não sei por que precisamos finally
de try...except...finally
declarações. Na minha opinião, esse bloco de código
try:
run_code1()
except TypeError:
run_code2()
other_code()
é o mesmo com este usando finally
:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Estou esquecendo de algo?
Você pode usar
finally
para garantir que arquivos ou recursos sejam fechados ou liberados, independentemente de ocorrer uma exceção, mesmo que você não a capture. (Ou se você não capturar essa exceção específica .)Neste exemplo, seria melhor usar o método
with
instrução, mas esse tipo de estrutura pode ser usado para outros tipos de recursos.Alguns anos depois, escrevi uma postagem no blog sobre um abuso
finally
que os leitores podem achar divertido.fonte
Eles não são equivalentes. Finalmente, o código é executado, não importa o que mais aconteça. É útil para códigos de limpeza que precisam ser executados.
fonte
Finally code is run no matter what else happens
... a menos que haja um loop infinito. Ou um powercut. Oros._exit()
. Ou ...os._exit
.Para adicionar às outras respostas acima, a
finally
cláusula é executada independentemente do que aelse
cláusula seja executada apenas se uma exceção não tiver sido gerada.Por exemplo, a gravação em um arquivo sem exceções produzirá o seguinte:
RESULTADO:
Se houver uma exceção, o código produzirá o seguinte (observe que um erro deliberado é causado pela manutenção do arquivo somente leitura.
RESULTADO:
Podemos ver que a
finally
cláusula é executada independentemente de uma exceção. Espero que isto ajude.fonte
else
era uma coisa. Útil saber.Os blocos de código não são equivalentes. o
finally
cláusula também será executada serun_code1()
lançar uma exceção diferente deTypeError
, ou serun_code2()
lançar uma exceção, enquantoother_code()
na primeira versão não seria executada nesses casos.fonte
No seu primeiro exemplo, o que acontece se
run_code1()
gera uma exceção que não éTypeError
? ...other_code()
não será executado.Compare isso com a
finally:
versão:other_code()
é garantido que seja executado, independentemente de qualquer exceção ser levantada.fonte
Conforme explicado na documentação , a
finally
cláusula destina-se a definir ações de limpeza que devem ser executadas em todas as circunstâncias .Um exemplo:
Como você pode ver, a
finally
cláusula é executada em qualquer evento. OTypeError
gerado pela divisão de duas seqüências de caracteres não é tratado pelaexcept
cláusula e, portanto, aumentado novamente após afinally
execução da cláusula.Em aplicativos do mundo real, a cláusula Finalmente é útil para liberar recursos externos (como arquivos ou conexões de rede), independentemente de o uso do recurso ter sido bem-sucedido.
fonte
Exemplo perfeito é como abaixo:
fonte
finally
é para definir "ações de limpeza" . Afinally
cláusula é executada em qualquer caso antes de sair dotry
instrução, independentemente de uma exceção (mesmo que você não a manipule).Eu segundo exemplo de @ Byers.
fonte
Finalmente, também pode ser usado quando você deseja executar o código "opcional" antes de executar o código para o seu trabalho principal e esse código opcional pode falhar por vários motivos.
No exemplo a seguir, não sabemos exatamente que tipo de exceção
store_some_debug_info
pode gerar.Nós poderíamos correr:
Mas, a maioria dos linters se queixam de pegar uma exceção muito vaga. Além disso, como optamos apenas
pass
por erros, oexcept
bloco realmente não agrega valor.O código acima tem o mesmo efeito que o primeiro bloco de código, mas é mais conciso.
fonte
Usar o delphi profissionalmente por alguns anos me ensinou a proteger minhas rotinas de limpeza usando finalmente. O Delphi reforça o uso de finalmente para limpar todos os recursos criados antes do bloco try, para que você não cause um vazamento de memória. É assim também que Java, Python e Ruby funcionam.
e os recursos serão limpos, independentemente do que você faça entre tentar e finalmente. Além disso, não será limpo se a execução nunca atingir o
try
bloco. (isto écreate_resource
, lança uma exceção) Torna seu código "exceção segura".Quanto ao motivo pelo qual você realmente precisa de um bloco finalmente, nem todos os idiomas precisam. No C ++, você chama automaticamente destruidores que impõem a limpeza quando uma exceção desenrola a pilha. Eu acho que este é um passo na direção de um código mais limpo comparado a tentar ... finalmente idiomas.
fonte
Um bloco try possui apenas uma cláusula obrigatória: A instrução try. As cláusulas exceto, else e finalmente são opcionais e baseadas na preferência do usuário.
finalmente: Antes de o Python deixar a instrução try, ele executará o código no bloco final sob quaisquer condições, mesmo que esteja finalizando o programa. Por exemplo, se o Python encontrou um erro ao executar o código no bloco exceto ou então, o bloco finalmente ainda será executado antes de parar o programa.
fonte
Execute estes códigos Python3 para observar a necessidade de finalmente:
CASO 1:
CASO2:
Tente as seguintes entradas sempre:
** Em um estágio muito inicial do aprendizado de Python.
fonte
Eu estava tentando executar um código onde eu queria ler folhas de excel. O problema era que, se houver um arquivo que não possui uma planilha com o nome digamos: SheetSum Não consigo movê-lo para o local do erro !! O código que escrevi foi:
Erro:
Eu tive que adicionar um
try except with finally
bloco completo e dizer quefinally
eu preciso fechar o arquivo em qualquer caso, como:Caso contrário, o arquivo ainda permanece aberto é o plano de fundo.
..Mais Aqui
fonte