Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> python

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:

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:

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

  1. Dominando Tipos de Dados em Python: Guia Prático
  2. Dominando Operadores em Python: Guia Completo
  3. Dominando a Declaração Pass em Python: Guia Prático
  4. Dominando Argumentos de Funções em Python: Parâmetros Posicionais, Nomeados e Padrão
  5. Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
  6. Dominando Erros e Exceções Built-in do Python
  7. Dominando Tratamento de Exceções em Python: try, except, else e finally Explicados
  8. Dominando Exceções Customizadas em Python: Guia Prático
  9. Dominando Iteradores em Python: Como Funcionam e Como Criar os Seus
  10. Closures em Python Explicados: Como Funções Aninhadas Capturam Variáveis