Tratamento de Exceções em Python: Guia Completo
O Python fornece dois recursos muito importantes para lidar com qualquer erro inesperado em seus programas Python e adicionar recursos de depuração:
Tratamento de Exceções - Será abordado neste tutorial. Aqui está uma lista de exceções padrão disponíveis no Python: Exceções Padrão.
Asserções - Será abordado no tutorial Asserções em Python.
Lista de Exceções Padrão
| Nº | Nome da Exceção e Descrição |
|---|---|
| 1 | Exception Classe base para todas as exceções |
| 2 | StopIteration Levantada quando o método next() de um iterador não aponta para nenhum objeto. |
| 3 | SystemExit Levantada pela função sys.exit(). |
| 4 | StandardError Classe base para todas as exceções embutidas, exceto StopIteration e SystemExit. |
| 5 | ArithmeticError Classe base para todos os erros que ocorrem em cálculos numéricos. |
| 6 | OverflowError Levantada quando um cálculo excede o limite máximo para um tipo numérico. |
| 7 | FloatingPointError Levantada quando um cálculo de ponto flutuante falha. |
| 8 | ZeroDivisionError Levantada quando divisão ou módulo por zero ocorre para todos os tipos numéricos. |
| 9 | AssertionError Levantada em caso de falha da instrução Assert. |
| 10 | AttributeError Levantada em caso de falha de referência ou atribuição de atributo. |
| 11 | EOFError Levantada quando não há entrada nem da função raw_input() nem input() e o fim do arquivo é alcançado. |
| 12 | ImportError Levantada quando uma instrução import falha. |
| 13 | KeyboardInterrupt Levantada quando o usuário interrompe a execução do programa, geralmente pressionando Ctrl+c. |
| 14 | LookupError Classe base para todos os erros de busca. |
| 15 | IndexError Levantada quando um índice não é encontrado em uma sequência. |
| 16 | KeyError Levantada quando a chave especificada não é encontrada no dicionário. |
| 17 | NameError Levantada quando um identificador não é encontrado no namespace local ou global. |
| 18 | UnboundLocalError Levantada ao tentar acessar uma variável local em uma função ou método, mas nenhum valor foi atribuído a ela. |
| 19 | EnvironmentError Classe base para todas as exceções que ocorrem fora do ambiente Python. |
| 20 | IOError Levantada quando uma operação de entrada/saída falha, como a instrução print ou a função open() ao tentar abrir um arquivo que não existe. |
| 21 | OSError Levantada para erros relacionados ao sistema operacional. |
| 22 | SyntaxError Levantada quando há um erro na sintaxe do Python. |
| 23 | IndentationError Levantada quando a indentação não é especificada corretamente. |
| 24 | SystemError Levantada quando o interpretador encontra um problema interno, mas o interpretador Python não sai. |
| 25 | SystemExit Levantada quando o interpretador Python é encerrado usando a função sys.exit(). Se não tratada no código, causa a saída do interpretador. |
| 26 | TypeError Levantada quando uma operação ou função é tentada que é inválida para o tipo de dados especificado. |
| 27 | ValueError Levantada quando a função embutida para um tipo de dados tem o tipo válido de argumentos, mas os argumentos têm valores inválidos especificados. |
| 28 | RuntimeError Levantada quando um erro gerado não se enquadra em nenhuma categoria. |
| 29 | NotImplementedError Levantada quando um método abstrato que precisa ser implementado em uma classe herdada não é realmente implementado. |
Asserções em Python
Uma asserção é uma verificação de sanidade que você pode ativar ou desativar quando terminar os testes do programa.
A maneira mais fácil de pensar em uma asserção é compará-la a uma instrução raise-if (ou, mais precisamente, uma instrução raise-if-not). Uma expressão é testada e, se o resultado for falso, uma exceção é levantada.
Asserções são realizadas pela instrução assert, a palavra-chave mais recente do Python, introduzida na versão 1.5.
Programadores frequentemente colocam asserções no início de uma função para verificar entrada válida e após uma chamada de função para verificar saída válida.
A Instrução assert
Quando encontra uma instrução assert, o Python avalia a expressão que a acompanha, que esperamos seja verdadeira. Se a expressão for falsa, o Python levanta uma exceção AssertionError.
A sintaxe para assert é:
assert Expressão[, Argumentos]
Se a asserção falhar, o Python usa ArgumentExpression como argumento para o AssertionError. Exceções AssertionError podem ser capturadas e tratadas como qualquer outra exceção usando a instrução try-except, mas se não tratadas, elas terminarão o programa e produzirão um traceback.
Exemplo
Aqui está uma função que converte uma temperatura de graus Kelvin para graus Fahrenheit. Como zero graus Kelvin é o mais frio possível, a função sai se vir uma temperatura negativa:
#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0), "Colder than absolute zero!"
return ((Temperature - 273) * 1.8) + 32
print(KelvinToFahrenheit(273))
print(int(KelvinToFahrenheit(505.78)))
print(KelvinToFahrenheit(-5))
Quando o código acima é executado, produz o seguinte resultado:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in
print(KelvinToFahrenheit(-5))
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0), "Colder than absolute zero!"
AssertionError: Colder than absolute zero!
O que é Exceção?
Uma exceção é um evento que ocorre durante a execução de um programa e interrompe o fluxo normal das instruções do programa. Em geral, quando um script Python encontra uma situação com a qual não pode lidar, ele levanta uma exceção. Uma exceção é um objeto Python que representa um erro.
Quando um script Python levanta uma exceção, ele deve tratá-la imediatamente; caso contrário, termina e encerra.
Tratando uma Exceção
Se você tem algum código suspeito que pode levantar uma exceção, pode defender seu programa colocando o código suspeito em um bloco try:. Após o bloco try:, inclua uma instrução except:, seguida por um bloco de código que trata o problema da forma mais elegante possível.
Sintaxe
Aqui está a sintaxe simples dos blocos try....except...else:
try:
Você faz suas operações aqui;
......................
except ExcecaoI:
Se houver ExcecaoI, execute este bloco.
except ExcecaoII:
Se houver ExcecaoII, execute este bloco.
......................
else:
Se não houver exceção, execute este bloco.
Aqui estão alguns pontos importantes sobre a sintaxe mencionada acima:
Uma única instrução try pode ter múltiplas instruções except. Isso é útil quando o bloco try contém instruções que podem lançar diferentes tipos de exceções.
Você também pode fornecer uma cláusula except genérica, que trata qualquer exceção.
Após a(s) cláusula(s) except, você pode incluir uma cláusula else. O código no bloco else executa se o código no bloco try: não levantar uma exceção.
O bloco else é um bom lugar para código que não precisa da proteção do bloco try:
Exemplo
Este exemplo abre um arquivo, escreve conteúdo no arquivo e sai graciosamente porque não há problema algum:
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
fh.close()
Isso produz o seguinte resultado:
Written content in the file successfully
Exemplo
Este exemplo tenta abrir um arquivo onde você não tem permissão de escrita, então levanta uma exceção:
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print("Error: can't find file or read data")
else:
print("Written content in the file successfully")
Isso produz o seguinte resultado:
Error: can't find file or read data
A Cláusula except Sem Exceções
Você também pode usar a instrução except sem exceções definidas da seguinte forma:
try:
Você faz suas operações aqui;
......................
except:
Se houver qualquer exceção, execute este bloco.
......................
else:
Se não houver exceção, execute este bloco.
Este tipo de instrução try-except captura todas as exceções que ocorrem. Usar este tipo de instrução try-except não é considerado uma boa prática de programação, pois captura todas as exceções, mas não faz o programador identificar a causa raiz do problema que pode ocorrer.
A Cláusula except com Múltiplas Exceções
Você também pode usar a mesma instrução except para tratar múltiplas exceções da seguinte forma:
try:
Você faz suas operações aqui;
......................
except(Excecao1[, Excecao2[,...ExcecaoN]]):
Se houver qualquer exceção da lista de exceções dada, execute este bloco.
......................
else:
Se não houver exceção, execute este bloco.
A Cláusula try-finally
Você pode usar um bloco finally: junto com um bloco try:. O bloco finally é um local para colocar qualquer código que deve ser executado, independentemente de o bloco try ter levantado uma exceção ou não. A sintaxe da instrução try-finally é:
try:
Você faz suas operações aqui;
......................
Devido a qualquer exceção, isso pode ser ignorado.
finally:
Isso sempre será executado.
......................
Você não pode usar a cláusula else junto com uma cláusula finally.
Exemplo
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print("Error: can't find file or read data")
Se você não tiver permissão para abrir o arquivo no modo de escrita, isso produzirá o seguinte resultado:
Error: can't find file or read data
O mesmo exemplo pode ser escrito de forma mais limpa da seguinte forma:
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print("Going to close the file")
fh.close()
except IOError:
print("Error: can't find file or read data")
Quando uma exceção é lançada no bloco try, a execução passa imediatamente para o bloco finally. Após todas as instruções no bloco finally serem executadas, a exceção é levantada novamente e tratada nas instruções except se presentes na próxima camada superior da instrução try-except.
Argumento de uma Exceção
Uma exceção pode ter um argumento, que é um valor que fornece informações adicionais sobre o problema. O conteúdo do argumento varia conforme a exceção. Você captura o argumento de uma exceção fornecendo uma variável na cláusula except da seguinte forma:
try:
Você faz suas operações aqui;
......................
except TipoExcecao, Argumento:
Você pode imprimir o valor do Argumento aqui...
Se você escrever o código para tratar uma única exceção, pode ter uma variável seguindo o nome da exceção na instrução except. Se estiver capturando múltiplas exceções, pode ter uma variável seguindo a tupla da exceção.
Esta variável recebe o valor da exceção, contendo principalmente a causa da exceção. A variável pode receber um único valor ou múltiplos valores na forma de uma tupla. Esta tupla geralmente contém a string de erro, o número do erro e uma localização do erro.
Exemplo
Segue um exemplo para uma única exceção:
#!/usr/bin/python
# Define uma função aqui.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print("The argument does not contain numbers\n", Argument)
# Chama a função acima aqui.
temp_convert("xyz")
Isso produz o seguinte resultado:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Levantando Exceções
Você pode levantar exceções de várias maneiras usando a instrução raise. A sintaxe geral para a instrução raise é:
Sintaxe
raise [Excecao [, args [, traceback]]]
Aqui, Excecao é o tipo de exceção (por exemplo, NameError) e argument é um valor para o argumento da exceção. O argumento é opcional; se não fornecido, o argumento da exceção é None.
O argumento final, traceback, também é opcional (e raramente usado na prática) e, se presente, é o objeto traceback usado para a exceção.
Exemplo
Uma exceção pode ser uma string, uma classe ou um objeto. A maioria das exceções que o núcleo do Python levanta são classes, com um argumento que é uma instância da classe. Definir novas exceções é bastante fácil e pode ser feito da seguinte forma:
def functionName(level):
if level < 1:
raise "Invalid level!", level
# O código abaixo não seria executado
# se levantássemos a exceção
Nota: Para capturar uma exceção, uma cláusula "except" deve referir-se à mesma exceção lançada, seja objeto de classe ou string simples. Por exemplo, para capturar a exceção acima, devemos escrever a cláusula except da seguinte forma:
try:
Business Logic here...
except "Invalid level!":
Exception handling here...
else:
Rest of the code here...
Exceções Definidas pelo Usuário
O Python também permite que você crie suas próprias exceções derivando classes das exceções embutidas padrão.
Aqui está um exemplo relacionado a RuntimeError. Aqui, uma classe é criada que é subclasse de RuntimeError. Isso é útil quando você precisa exibir informações mais específicas quando uma exceção é capturada.
No bloco try, a exceção definida pelo usuário é levantada e capturada no bloco except. A variável e é usada para criar uma instância da classe Networkerror.
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Uma vez definida a classe acima, você pode levantar a exceção da seguinte forma:
try:
raise Networkerror("Bad hostname")
except Networkerror as e:
print(e.args)
python
- Dominando Tipos de Dados em Python: Guia Prático
- Dominando Operadores em Python: Guia Completo
- Dominando a Declaração Pass em Python: Guia Prático
- Dominando Argumentos de Funções em Python: Parâmetros Posicionais, Nomeados e Padrão
- Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
- Dominando Erros e Exceções Built-in do Python
- Dominando Tratamento de Exceções em Python: try, except, else e finally Explicados
- Dominando Exceções Customizadas em Python: Guia Prático
- Dominando Iteradores em Python: Como Funcionam e Como Criar os Seus
- Closures em Python Explicados: Como Funções Aninhadas Capturam Variáveis