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