Tratando Diferentes Tipos de Exceções em Python
Em Python, podemos tratar diferentes tipos de exceções de maneira específica. Para isso, podemos utilizar a estrutura try...except
com um tipo específico de exceção para tratar, informando-o após a palavra except
:
try:
number = int(input("Digite um número: "))
print("Número digitado:", number)
except ValueError:
print("Conversão falhou")
print("Fim do programa")
Neste caso, o bloco except
lida apenas com exceções do tipo ValueError
, que ocorrem ao falhar na conversão de uma string em número.
Python possui os seguintes tipos básicos de exceções:
BaseException
: tipo base para todas as exceções embutidas.Exception
: tipo base geralmente utilizado para criar exceções personalizadas.ArithmeticError
: tipo base para exceções relacionadas a operações aritméticas (como OverflowError, ZeroDivisionError e FloatingPointError).BufferError
: ocorre quando uma operação de buffer não pode ser realizada.LookupError
: tipo base para exceções relacionadas a índices ou chaves inválidas em coleções (como IndexError e KeyError).
Esses tipos de exceções são a base para tipos de exceções mais específicos. Python tem uma ampla lista de exceções embutidas, disponível na documentação oficial. Abaixo, listamos algumas das mais comuns:
IndexError
: ocorre quando um índice está fora do intervalo permitido para uma coleção.KeyError
: ocorre quando uma chave não é encontrada em um dicionário.OverflowError
: ocorre quando o resultado de uma operação aritmética não pode ser representado pelo tipo numérico atual (geralmente do tipofloat
).RecursionError
: ocorre quando o limite máximo de recursão é excedido.TypeError
: ocorre quando uma operação ou função é aplicada a um valor de tipo inadequado.ValueError
: ocorre quando uma operação ou função recebe um objeto do tipo correto, mas com um valor inválido.ZeroDivisionError
: ocorre ao tentar dividir por zero.NotImplementedError
: indica que certos métodos de uma classe ainda não foram implementados.ModuleNotFoundError
: ocorre quando não é possível encontrar um módulo ao tentar importá-lo.OSError
: ocorre em erros de sistema, como a falta de um arquivo ou o esgotamento de memória no disco.
Caso a situação seja tal que a execução do programa possa lançar diferentes tipos de exceções, podemos tratá-las separadamente, usando expressões except
adicionais. Ao ocorrer uma exceção, Python procura o bloco except
correspondente para tratá-la:
try:
number1 = int(input("Digite o primeiro número: "))
number2 = int(input("Digite o segundo número: "))
print("Resultado da divisão:", number1/number2)
except ValueError:
print("Conversão falhou")
except ZeroDivisionError:
print("Tentativa de divisão por zero")
except BaseException:
print("Exceção geral")
print("Fim do programa")
Neste exemplo, tratamos exceções do tipo ValueError
, ZeroDivisionError
e BaseException
. Caso ocorra uma exceção que não seja do tipo ValueError
ou ZeroDivisionError
, o bloco BaseException
será executado.
Entretanto, se surgir uma exceção que não tenha um bloco except
correspondente, o programa não conseguirá tratá-la, resultando em uma falha. Veja o exemplo a seguir:
try:
number1 = int(input("Digite o primeiro número: "))
number2 = int(input("Digite o segundo número: "))
print("Resultado da divisão:", number1/number2)
except ZeroDivisionError:
print("Tentativa de divisão por zero")
print("Fim do programa")
Neste caso, apenas a divisão por zero é tratada. Caso o usuário digite uma string que não possa ser convertida para número, ocorrerá uma exceção ValueError
, que não será capturada, e o programa encerrará abruptamente.
Python também permite que múltiplos tipos de exceções sejam tratados em um único bloco except
, usando parênteses:
try:
number1 = int(input("Digite o primeiro número: "))
number2 = int(input("Digite o segundo número: "))
print("Resultado da divisão:", number1/number2)
except (ZeroDivisionError, ValueError): # tratamento de ZeroDivisionError e ValueError
print("Divisão por zero ou entrada incorreta")
print("Fim do programa")
Obtendo informações sobre a exceção
Podemos obter mais informações sobre uma exceção passando-a para uma variável com o operador as
, para uso no bloco except
:
try:
number = int(input("Digite um número: "))
print("Número digitado:", number)
except ValueError as e:
print("Informações sobre a exceção:", e)
print("Fim do programa")
Exemplo de entrada incorreta:
Digite um número: abc Informações sobre a exceção: invalid literal for int() with base 10: 'abc' Fim do programa