13.2 Tratando Exceções
Há muitos outros erros de tempo de execução. Que tal dividir um número por zero? Será que o interpretador consegue fazer aquilo que nós definimos que não existe?
n = 2
n = n /
Traceback (most recent call last): File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
Repare que um ZeroDivisionError poderia ser facilmente evitado com um if que checaria se o denominador é diferente de zero, mas a forma correta de se tratar um erro no Python é através do comando try/except:
try:
n = n/0
except ZeroDivisionError: print('divisão por zero')
Que gera a saída:
divisão por zero
O conjunto de instruções dentro do bloco try é executado (o interpretador tentará executar). Se nenhuma exceção ocorrer, o comando except é ignorado e a execução é finalizada. Todavia, se ocorrer alguma exceção durante a execução do bloco try , as instruções remanescentes serão ignoradas, e se a exceção lançada prever um except , as instruções dentro do bloco except serão executadas.
O comando try pode ter mais de um comando except para especificar múltiplos tratadores para
diferentes exceções. No máximo um único tratador será ativado. Tratadores só são sensíveis às exceções levantadas no interior da cláusulatry , e não as que tenham ocorrido no interior de outro tratador numa mesma instrução try . Um tratador pode ser sensível a múltiplas exceções, desde que as especifique em uma tupla:
except(RuntimeError, TypeError, NameError): pass
A última cláusula except pode omitir o nome da exceção, funcionando como um coringa. Não é aconselhável abusar deste recurso, já que isso pode esconder erros do programador e do usuário.
O bloco try/except possui um comando opcional else que, quando usado, deve ser colocado depois de todos os comandos except . É um comando útil para códigos que precisam ser executados se nenhuma exceção foi lançada, por exemplo:
try:
arquivo = open('palavras.txt', 'r') except IOError:
print('não foi possível abrir o arquivo') else:print(f'o arquivo tem {} palavras {len(arquivo.readlines(}'))) arquivo.close()