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 BaseException
classe.
No entanto, quase todas as classes de exceção integradas herdam da Exception
classe, que é a subclasse da BaseException
classe:
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 IndexError
exceção conforme esperado:
IndexError: list index out of range
Linguagem 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...except
instruçã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 run
Linguagem de código: texto simples ( texto simples )
Neste exemplo, usamos a try...except
instrução para tratar a IndexError
exceção. Como você pode ver na saída, o programa continua em execução após a try...except
instrução.
A IndexError
classe herda da LookupError
classe que herda da Exception
classe:
E você pode capturar uma LookupError
ou outra Exception
classe quando IndexError
ocorrer 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 run
Linguagem de código: texto simples ( texto simples )
Neste exemplo, a exceção continua IndexError
mesmo 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 Exception
classe em vez da LookupError
classe:
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 run
Linguagem 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 division
funçã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 zero
Linguagem de código: texto simples ( texto simples )
Neste exemplo, se b for zero, ZeroDivisionError
ocorrerá a exceção. Para lidar com a ZeroDivisionError
exceção, você usa a try...except
instruçã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.message
indica a mensagem de erro ou sucesso.result
armazena o resultado de a/b ouNone
se b for zero.
O seguinte mostra a saída se isso ZeroDivisionError
ocorrer:
{'success': False, 'message': 'b cannot be zero', 'result': None}
Linguagem de código: texto simples ( texto simples )
Agora, se você não capturar a ZeroDivisionError
exceção, mas a exceção mais geral como Exception
a 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...except
também captura o tipo de exceção que é a subclasse da Exception
classe.
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 ZeroDivisionError
exceçã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 é ZeroDivisionError
senão o TypeError
. No entanto, o código ainda trata isso como uma ZeroDivisionError
exceçã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
, ZeroDivisionError
e Exception
na ordem em que aparecem na try...except
instruçã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.