Exceções Python

Resumo : neste tutorial, você aprenderá sobre as exceções do Python e como lidar com elas normalmente em programas.

Introdução às exceções do Python

Em Python, exceções são objetos das classes de exceção . Todas as classes de exceção são subclasses da BaseExceptionclasse.

No entanto, quase todas as classes de exceção integradas herdam da Exceptionclasse, que é a subclasse da BaseExceptionclasse:

exceções python

Esta página mostra uma hierarquia de classes completa para exceções integradas em Python .

O exemplo a seguir define uma lista de três elementos e tenta acessar o quarto:

colors = ['red', 'green', 'blue']

print(colors[3])Linguagem de código:  Python  ( python )

O índice inválido causou a IndexErrorexceção conforme esperado:

IndexError: list index out of rangeLinguagem de código:  Python  ( python )

Quando ocorre uma exceção, o Python interrompe o programa, a menos que você o resolva. Para lidar com uma exceção, você usa a try...exceptinstrução. Por exemplo:

colors = ['red', 'green', 'blue']

try:
    print(colors[3])
except IndexError as e:
    print(e)


print('Continue to run')Linguagem de código:  Python  ( python )

Saída:

<class 'IndexError'> - list index out of range
Continue to runLinguagem de código:  texto simples  ( texto simples )

Neste exemplo, usamos a try...exceptinstrução para tratar a IndexErrorexceção. Como você pode ver na saída, o programa continua em execução após a try...exceptinstrução.

A IndexErrorclasse herda da LookupErrorclasse que herda da Exceptionclasse:

E você pode capturar uma LookupErrorou outra Exceptionclasse quando IndexErrorocorrer uma exceção. Por exemplo:

colors = ['red', 'green', 'blue']

try:
    print(colors[3])
except LookupError as e:
    print(e.__class__, '-', e)

print('Continue to run')Linguagem de código:  Python  ( python )

Saída:

<class 'IndexError'> - list index out of range
Continue to runLinguagem de código:  texto simples  ( texto simples )

Neste exemplo, a exceção continua IndexErrormesmo que a capturemos LookupError. Portanto, quando você trata uma exceção, o manipulador de exceção capturará o tipo de exceção especificado e qualquer uma de suas subclasses.

O programa é executado da mesma forma se você usar a Exceptionclasse em vez da LookupErrorclasse:

colors = ['red', 'green', 'blue']

try:
    print(colors[3])
except Exception as e:
    print(e.__class__, '-', e)

print('Continue to run')Linguagem de código:  Python  ( python )

Saída:

<class 'IndexError'> - list index out of range
Continue to runLinguagem de código:  texto simples  ( texto simples )

Na prática, você deve capturar as exceções da forma mais específica possível para saber como lidar com cada exceção de uma maneira específica.

Exemplo de tratamento de exceção Python

O exemplo a seguir define uma divisionfunção que retorna o resultado de a dividido por b:

def division(a, b):
    return a / b


c = division(10, 0)Linguagem de código:  Python  ( python )

Saída:

ZeroDivisionError: division by zeroLinguagem de código:  texto simples  ( texto simples )

Neste exemplo, se b for zero, ZeroDivisionErrorocorrerá a exceção. Para lidar com a ZeroDivisionErrorexceção, você usa a try...exceptinstrução da seguinte maneira:

def division(a, b):
    try:
        return {
            'success': True,
            'message': 'OK',
            'result': a / b
        }
    except ZeroDivisionError as e:
        return {
            'success': False,
            'message': 'b cannot be zero',
            'result': None
        }


result = division(10, 0)
print(result)Linguagem de código:  Python  ( python )

Neste exemplo, a função retorna um dicionário que possui três elementos:

  • successé um valor booleano que indica se a operação foi bem-sucedida ou não.
  • messageindica a mensagem de erro ou sucesso.
  • resultarmazena o resultado de a/b ou Nonese b for zero.

O seguinte mostra a saída se isso ZeroDivisionErrorocorrer:

{'success': False, 'message': 'b cannot be zero', 'result': None}Linguagem de código:  texto simples  ( texto simples )

Agora, se você não capturar a ZeroDivisionErrorexceção, mas a exceção mais geral como Exceptiona classe:

def division(a, b):
    try:
        return {
            'success': True,
            'message': 'OK',
            'result': a / b
        }
    except Exception as e:
        return {
            'success': False,
            'message': 'b cannot be zero',
            'result': None
        }


result = division(10, 0)
print(result)Linguagem de código:  Python  ( python )

O programa funciona como antes porque try...excepttambém captura o tipo de exceção que é a subclasse da Exceptionclasse.

No entanto, se você passar duas strings em vez de dois números para a division()função, receberá a mesma mensagem como se a ZeroDivisionErrorexceção tivesse ocorrido:

def division(a, b):
    try:
        return {
            'success': True,
            'message': 'OK',
            'result': a / b
        }
    except Exception as e:
        return {
            'success': False,
            'message': 'b cannot be zero',
            'result': None
        }


result = division('10', '2')
print(result)Linguagem de código:  Python  ( python )

Saída:

{'success': False, 'message': 'b cannot be zero', 'result': None}Linguagem de código:  texto simples  ( texto simples )

Neste exemplo, a exceção não é ZeroDivisionErrorsenão o TypeError. No entanto, o código ainda trata isso como uma ZeroDivisionErrorexceção.

Portanto, você deve sempre tratar as exceções das mais específicas para as menos específicas. Por exemplo:

def division(a, b):
    try:
        return {
            'success': True,
            'message': 'OK',
            'result': a / b
        }
    except TypeError as e:
        return {
            'success': False,
            'message': 'Both a & b must be numbers',
            'result': None
        }
    except ZeroDivisionError as e:
        return {
            'success': False,
            'message': 'b cannot be zero',
            'result': None
        }
    except Exception as e:
        return {
            'success': False,
            'message': str(e),
            'result': None
        }


result = division('10', '2')
print(result)Linguagem de código:  Python  ( python )

Neste exemplo, capturamos TypeError, ZeroDivisionErrore Exceptionna ordem em que aparecem na try...exceptinstrução.

Se o código que trata diferentes exceções for o mesmo, você poderá agrupar todas as exceções em uma da seguinte maneira:

def division(a, b):
    try:
        return {
            'success': True,
            'message': 'OK',
            'result': a / b
        }
    except (TypeError, ZeroDivisionError, Exception) as e:
        return {
            'success': False,
            'message': str(e),
            'result': None
        }


result = division(10, 0)
print(result)Linguagem de código:  Python  ( python )

Saída:

{'success': False, 'message': 'division by zero', 'result': None}Linguagem de código:  texto simples  ( texto simples )

Resumo

  • As exceções do Python são objetos de classes, que são as subclasses da classe BaseException.
  • Trate a exceção da mais específica para a menos específica.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *