Conceito de exceções

Tratamento de exceções

Quando trabalhamos com arquivos, é comum encontrarmos alguns problemas, como arquivo inexistente e falta de permissão para escrever em um. A maioria desses problemas só pode ser detectada durante a execução do programa. Quando uma falha inesperada ocorre e o interpretador não consegue resolver o problema, dizemos que houve uma exceção.

Nesses casos, precisamos informar ao interpretador como tratar a exceção, para que o programa não seja interrompido. Se a exceção é um problema inesperado, como tratá-la? Ao desenvolver um programa, precisamos procurar na documentação da biblioteca, do módulo ou da própria linguagem de programação se as funcionalidades que vamos utilizar têm exceções mapeadas. Essas exceções são problemas que podem ocorrer, e é nossa tarefa tratá-las.

❓ Você deve estar se perguntando: “O que seria ‘tratar uma exceção?”. Isso nada mais é do que dizer ao Python o que fazer, ou quais instruções executar, quando ele encontrar um problema.

Tratar uma exceção significa lidar com um erro ou situação inesperada que pode ocorrer durante a execução de um programa. Quando uma exceção é levantada em um programa, o programa interrompe sua execução normal e tenta encontrar um bloco de código que possa lidar com a exceção. Isso é importante para garantir que o programa continue a ser executado mesmo quando ocorrerem erros, evitando que ele quebre de forma inesperada.

Para ilustrar, observe os seguintes passos:

  1. Quando abrimos um arquivo em modo leitura e esse arquivo não existe, o Python lança uma exceção do tipo FileNotFoundError.

  2. Se não avisarmos ao Python o que fazer quando isso ocorrer, o programa será interrompido.

  3. Nesse caso, um tratamento para essa exceção poderia ser: exibir um pop-up ao usuário informando que o arquivo não existe.

<aside> 🗨️ Existem diversas formas de tratar exceções em Python, como a utilização de blocos try-except para capturar exceções específicas e realizar ações para lidar com elas, ou a utilização do bloco finally para executar ações que devem ser realizadas independentemente de ter ocorrido uma exceção ou não.

</aside>

Mas o que acontece quando uma exceção lançada não é tratada?

Ela interrompe a execução normal do programa e uma mensagem de erro é exibida no console. Essa mensagem contém informações sobre o tipo de exceção que ocorreu e a linha de código onde ela aconteceu. Se a exceção não for tratada, o programa irá parar de executar e o usuário poderá ter dificuldades para entender o que aconteceu e como corrigir o problema.

Além disso, se o programa não estiver em um ambiente de desenvolvimento, a mensagem de erro pode não ser visível para o usuário final e o programa pode simplesmente travar ou fechar inesperadamente.

Para resolver isso, precisamos tratar a exceção, ou melhor, uma possível exceção. Esse tratamento informa ao Python uma rota alternativa, caso ele encontre um problema.

Para tratar exceções, precisamos “envolver” o trecho de código passível de erro com a cláusula try/except ou try/except/finally. Veremos apenas a cláusula try/except. Essa estrutura permite que um trecho de código seja executado normalmente até que ocorra uma exceção, que será capturada e tratada no bloco except.

try:
    x = int(input("Digite um número: "))
    y = int(input("Digite outro número: "))
    resultado = x / y
    print(f"O resultado da divisão é: {resultado}")
except ZeroDivisionError:
    print("Não é possível dividir por zero")
except ValueError:
    print("Digite apenas números inteiros")

Ao usar o try-except, o programa tenta executar o bloco de código dentro do try. Se ocorrer uma exceção, o programa captura a exceção e executa o bloco except correspondente. No exemplo acima, se o usuário tentar dividir por zero, o programa exibirá a mensagem "Não é possível dividir por zero" em vez de gerar um erro e parar a execução. Se o usuário digitar um valor inválido, como uma letra, o programa exibirá a mensagem "Digite apenas números inteiros".

Dessa forma, com o tratamento de exceções, podemos evitar que o programa pare de funcionar de forma inesperada e podemos fornecer uma mensagem mais clara e compreensível para o usuário. Praticamente todas as exceções em Python são herdadas da classe Exception, ou seja, ela é uma exceção muito genérica, lançada por diversos tipos de erros diferentes. Quanto mais genérica, mais abrangente é a exceção.

<aside> ⚠️ Atenção!

Não é uma boa prática utilizar exceções abrangentes, pois elas podem silenciar erros que não esperamos. O ideal é tratar as exceções utilizando a forma mais específica possível.

</aside>