Python - Tratamento de Exceções
O Python fornece dois recursos muito importantes para lidar com qualquer erro inesperado em seus programas Python e adicionar recursos de depuração neles -
-
Tratamento de exceções − Isso seria abordado neste tutorial. Aqui está uma lista de exceções padrão disponíveis em Python:Exceções padrão.
-
Afirmações − Isso seria abordado no tutorial Assertions in Python.
Lista de Exceções Padrão -
Nº Sr. | Nome e descrição da exceção |
---|---|
1 | Exceção Classe base para todas as exceções |
2 | Parar Iteração Gerado quando o método next() de um iterador não aponta para nenhum objeto. |
3 | Sair do sistema Gerado pela função sys.exit(). |
4 | Erro Padrão Classe base para todas as exceções internas, exceto StopIteration e SystemExit. |
5 | Erro Aritmético Classe base para todos os erros que ocorrem no cálculo numérico. |
6 | Erro de estouro Gerado quando um cálculo excede o limite máximo para um tipo numérico. |
7 | FloatingPointError Gerado quando um cálculo de ponto flutuante falha. |
8 | ZeroDivisionError Gerado quando a divisão ou módulo por zero ocorre para todos os tipos numéricos. |
9 | AssertionError Gerado em caso de falha da declaração Assert. |
10 | Erro de atributo Gerado em caso de falha de referência ou atribuição de atributo. |
11 | EOFError Gerado quando não há entrada da função raw_input() ou input() e o final do arquivo é atingido. |
12 | ImportError Gerado quando uma instrução de importação falha. |
13 | Interrupção do teclado Gerado quando o usuário interrompe a execução do programa, geralmente pressionando Ctrl+c. |
14 | Erro de pesquisa Classe base para todos os erros de pesquisa. |
15 | IndexError Gerado quando um índice não é encontrado em uma sequência. |
16 | Erro de chave Gerado quando a chave especificada não é encontrada no dicionário. |
17 | NameError Gerado quando um identificador não é encontrado no namespace local ou global. |
18 | UnboundLocalError Gerado 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 Gerado 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 | IOError Gerado para erros relacionados ao sistema operacional. |
22 | Erro de sintaxe Gerado quando há um erro na sintaxe do Python. |
23 | Erro de recuo Gerado quando o recuo não é especificado corretamente. |
24 | SystemError Gerado quando o interpretador encontra um problema interno, mas quando esse erro é encontrado, o interpretador Python não sai. |
25 | Sair do sistema Gerado quando o interpretador Python é encerrado usando a função sys.exit(). Se não for tratado no código, faz com que o interpretador saia. |
26 | TypeError Gerado quando uma operação ou função é tentada que é inválida para o tipo de dados especificado. |
27 | ValueError Gerado quando a função interna de um tipo de dados tem o tipo válido de argumentos, mas os argumentos têm valores inválidos especificados. |
28 | RuntimeError Gerado quando um erro gerado não se enquadra em nenhuma categoria. |
29 | NotImplementedError Gerado 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 de testar o programa.
A maneira mais fácil de pensar em uma afirmação é compará-la a um raise-if declaração (ou para ser mais preciso, uma declaração raise-if-not). Uma expressão é testada e, se o resultado for falso, uma exceção é gerada.
Asserções são realizadas pela declaração assert, a mais nova palavra-chave do Python, introduzida na versão 1.5.
Os programadores geralmente colocam asserções no início de uma função para verificar a entrada válida e após uma chamada de função para verificar a saída válida.
A afirmação Declaração
Quando encontra uma declaração assert, o Python avalia a expressão que a acompanha, que esperamos ser verdadeira. Se a expressão for falsa, o Python gera um AssertionError exceção.
A sintaxe para assert é -
assert Expression[, Arguments]
Se a asserção falhar, o Python usará ArgumentExpression como argumento para o AssertionError. As exceções AssertionError podem ser capturadas e tratadas como qualquer outra exceção usando a instrução try-except, mas se não forem tratadas, elas encerrarã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 vê uma temperatura negativa -
Demonstração ao vivo
#!/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, ele produz o seguinte resultado -
32.0 451 Traceback (most recent call last): File "test.py", line 9, in <module> 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 que 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 gera uma exceção. Uma exceção é um objeto Python que representa um erro.
Quando um script Python gera uma exceção, ele deve tratar a exceção imediatamente, caso contrário, ele será encerrado e encerrado.
Gerenciando uma exceção
Se você tiver algum suspeito código que pode gerar uma exceção, você pode defender seu programa colocando o código suspeito em um try: quadra. Após o bloco try:, inclua um exceto: instrução, seguida por um bloco de código que trata o problema da forma mais elegante possível.
Sintaxe
Aqui está a sintaxe simples de try....except...else blocos -
try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI, then execute this block. except ExceptionII: If there is ExceptionII, then execute this block. ...................... else: If there is no exception then execute this block.
Aqui estão alguns pontos importantes sobre a sintaxe acima mencionada -
-
Uma única instrução try pode ter várias 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 é executado se o código no bloco try:não gerar 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, grava conteúdo no arquivo e sai normalmente porque não há nenhum problema -
Demonstração ao vivo
#!/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 gravação, então ele gera uma exceção -
Demonstração ao vivo
#!/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
O exceto Cláusula sem exceções
Você também pode usar a instrução except sem exceções definidas da seguinte forma -
try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... else: If there is no exception then execute this block.
Esse tipo de experimentar exceto A instrução captura todas as exceções que ocorrem. Usar esse 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 com que o programador identifique a causa raiz do problema que pode ocorrer.
O exceto Cláusula com múltiplas exceções
Você também pode usar o mesmo exceto instrução para lidar com várias exceções da seguinte forma -
try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block.
A cláusula try-finally
Você pode usar um finalmente: bloquear junto com um tentar: quadra. O bloco finally é um lugar para colocar qualquer código que deve ser executado, quer o bloco try tenha gerado uma exceção ou não. A sintaxe da instrução try-finally é esta -
try: You do your operations here; ...................... Due to any exception, this may be skipped. finally: This would always be executed. ......................
Você não pode usar mais cláusula, bem como uma cláusula finalmente.
Exemplo
Demonstração ao vivo#!/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 gravação, 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 -
Demonstração ao vivo
#!/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 try bloco, a execução passa imediatamente para o finalmente quadra. Depois de todas as declarações no finalmente bloco são executados, a exceção é levantada novamente e é tratada no exceto instruções se estiverem presentes na próxima camada superior do try-except declaração.
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 por exceção. Você captura o argumento de uma exceção fornecendo uma variável na cláusula except da seguinte forma −
try: You do your operations here; ...................... except ExceptionType, Argument: You can print value of Argument here...
Se você escrever o código para lidar com uma única exceção, poderá fazer com que uma variável siga o nome da exceção na instrução except. Se você estiver interceptando várias exceções, poderá fazer com que uma variável siga 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 vários valores na forma de uma tupla. Essa tupla geralmente contém a string do erro, o número do erro e um local do erro.
Exemplo
A seguir está um exemplo para uma única exceção -
Demonstração ao vivo
#!/usr/bin/python # Define a function here. def temp_convert(var): try: return int(var) except ValueError, Argument: print "The argument does not contain numbers\n", Argument # Call above function here. temp_convert("xyz");
Isso produz o seguinte resultado -
The argument does not contain numbers invalid literal for int() with base 10: 'xyz'
Criando uma exceção
Você pode gerar exceções de várias maneiras usando a instrução raise. A sintaxe geral para o aumento declaração é a seguinte.
Sintaxe
raise [Exception [, args [, traceback]]]
Aqui, Exceção é o tipo de exceção (por exemplo, NameError) e argumento é um valor para o argumento de exceção. O argumento é opcional; se não for fornecido, o argumento de exceção será Nenhum.
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 gera 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 # The code below to this would not be executed # if we raise the exception
Observação: Para capturar uma exceção, uma cláusula "exceto" deve se referir à 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 internas padrão.
Aqui está um exemplo relacionado a RuntimeError . Aqui, uma classe é criada com uma 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 é gerada 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
Então, uma vez que você definiu a classe acima, você pode gerar a exceção da seguinte forma -
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
python
- Tipos de dados Python
- Operadores Python
- Instrução de passagem do Python
- Argumentos da função Python
- Dicionário Python
- Erros do Python e exceções incorporadas
- Manipulação de Exceções do Python Usando a instrução try, except e finally
- Exceções personalizadas do Python
- Iteradores Python
- Fechamentos Python