15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

sejam propagadas para os níveis superiores, mas também quiser rodar um código

de limpeza quando a exceção ocorrer. Um uso bastante comum de try/finally é

para assegurar o fechamento de manipuladores de arquivos, os file handles

(consulte o Item 43: “Considere os comandos contextlib e with para um

comportamento reutilizável de try/finally” para outro modo de implementação).

handle = open('/tmp/random_data.txt') # Pode gerar um erro de E/S (IOError)

try:

data = handle.read() # Pode gerar um erro de decodificação Unicode

# (UnicodeDecodeError)

finally:

handle.close() # Sempre é executado depois do try

Qualquer exceção que ocorra na execução do método read sempre será

propagada para o código chamador, mas mesmo assim o método close do

manipulador de arquivos de nome handle é garantidamente executado no bloco

finally. É obrigatório chamar open antes de try porque as exceções que ocorram

no momento da abertura do arquivo (como IOError se o arquivo não existir) não

devem ser tratados pelo bloco finally e, portanto, precisam se desviar dele.

Blocos Else

Use try/except/else (em português, tente/exceto se/senão) para deixar bem claro

quais exceções serão tratadas pelo seu código e quais serão propagadas para os

níveis superiores. Quando o bloco try não gera uma exceção, o bloco else será

executado. O bloco else ajuda a minimizar a quantidade de código no bloco try e

melhora a legibilidade. Por exemplo, imagine que se queira carregar dados de

um dicionário JSON a partir de uma string e devolver o valor de uma chave

contida nele.

def load_json_key(data, key):

try:

result_dict = json.loads(data) # Pode gerar o erro ValueError

except ValueError as e:

raise KeyError from e

else:

return result_dict[key] # Pode gerar o erro KeyError

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!