Erros e exceções podem levar à falha do programa ou a um comportamento inesperado, e o Python vem com um conjunto robusto de ferramentas para melhorar a estabilidade do código.
Erros e exceções podem levar a um comportamento inesperado ou até mesmo interromper a execução de um programa. O Python fornece várias funções e mecanismos para lidar com esses problemas e melhorar a robustez do código. Neste tutorial, você aprenderá sobre vários tipos de erro e funções internas com exemplos.
Um erro é um problema em um programa que o impede de concluir sua tarefa. Em comparação, uma exceção é uma condição que interrompe o fluxo normal do programa. Tanto os erros quanto as exceções são um tipo de erro de tempo de execução, o que significa que ocorrem durante a execução de um programa.
Em palavras simples, o erro é um problema crítico que um aplicativo normal não deve detectar, enquanto uma exceção é uma condição que um programa deve detectar.
Vamos aprender mais sobre erros e exceções observando vários exemplos. Para executá-los com facilidade, você pode criar gratuitamente uma pasta de trabalho do DataLab que tenha o Python pré-instalado e contenha todos os exemplos de código.
Erros em Python
Aqui está um exemplo de um erro de sintaxe em que um retorno fora da função não significa nada. Não devemos lidar com erros em um programa. Em vez disso, devemos criar uma função que retorne a string.
Input In [1]return"DataCamp"^
SyntaxError:'return' outside function
Tecnologia
Criamos a função, mas com o recuo errado. Não devemos tratar erros de indentação em tempo de execução. Você pode fazer isso manualmente ou usar ferramentas de formatação de código.
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Input In [4],in<cell line:1>()---->1 test =1/0
ZeroDivisionError: division by zeroTecnologia
NameError As exceções são bastante comuns quando uma variável não é encontrada. Também podemos tratar a exceção substituindo a variável ou imprimindo o aviso.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [5],in<cell line:1>()---->1 y = test
NameError
Tecnologia
Exceções integradas do Python
Aqui está a lista de exceções padrão do Python com descrições:
AssertionError: gerado quando a instrução assert falha.
EOFError: gerado quando a função input() atende à condição de fim de arquivo.
AttributeErrorQuando a atribuição de atributo ou a referência falhar.
TabErrorQuando você não tem acesso a um recuo, o que acontece é que o recuo consiste em tabulações ou espaços inconsistentes.
ImportError: gerado quando a importação do módulo falha.
IndexErrorOcorre quando o índice de uma sequência está fora do intervalo
KeyboardInterruptQuando o usuário digita teclas de interrupção (Ctrl + C ou Delete).
RuntimeErrorOcorre quando um erro não se enquadra em nenhuma categoria.
NameErrorQuando uma variável não é encontrada no escopo local ou global.
MemoryErrorQuando você está em um programa, o que você está fazendo?
ValueErrorOcorre quando a operação ou função recebe um argumento com o tipo correto, mas com o valor incorreto.
ZeroDivisionError: gerado quando você divide um valor ou uma variável por zero.
SyntaxError: levantado pelo analisador quando a sintaxe do Python está errada.
IndentationErrorOcorre quando há um recuo errado.
SystemErrorErro interno: gerado quando o interpretador detecta um erro interno.
Você pode encontrar uma lista completa de erros e exceções no Python lendo a documentação.
Aprenda sobre exceções em Python fazendo nosso curso Programação orientada a objetos em Python. Ele ensinará a você como criar classes e aproveitar a herança e o polimorfismo para reutilizar e otimizar o código.
Tratamento de exceções com try, except, else e finally
Depois de aprender sobre erros e exceções, aprenderemos a lidar com eles usando os blocos try, except, else e finally.
Então, o que queremos dizer com lidar com eles? Em circunstâncias normais, esses erros interromperão a execução do código e exibirão a mensagem de erro. Para criar sistemas estáveis, precisamos prever esses erros e apresentar soluções alternativas ou mensagens de aviso.
Nesta seção, aprenderemos o que cada bloco faz e como podemos usá-los para escrever um código robusto.
A instrução try e except
A maneira mais simples de lidar com exceções em Python é usar o bloco try e except.
Execute o código na instrução try.
Quando uma exceção for levantada, execute o código na instrução except.
Em vez de parar em um erro ou exceção, nosso código seguirá para soluções alternativas.
Exemplo simples
No primeiro exemplo, tentaremos imprimir a variável indefinida x. Em circunstâncias normais, ele deve lançar o erro e interromper a execução, mas com o bloco try e except, podemos alterar o comportamento do fluxo.
O programa executará o código na instrução try.
Como sabemos, o x não está definido, portanto, você executará a instrução except e imprimirá o aviso.
try:print(x)except:print("An exception has occurred!")Tecnologia
Agora, vamos dar uma olhada em um exemplo mais prático.
No código abaixo, estamos lendo o arquivo CSV e, quando ele gerar a exceção FileNotFoundError, o código imprimirá o erro e uma mensagem adicional sobre o arquivo data.csv.
Sim, podemos imprimir mensagens de erro padrão sem interromper a execução.
try:withopen('data.csv')asfile:
read_data =file.read()except FileNotFoundError as fnf_error:print(fnf_error)print("Explanation: We cannot load the 'data.csv' file")Tecnologia
[Errno 2] No such fileor directory:'data.csv'
Explanation: We cannot load the 'data.csv'fileTecnologia
O try com a cláusula else
Você já aprendeu sobre try e except e agora aprenderá sobre a declaração else.
Quando a instrução try não gera uma exceção, o código entra no bloco else. É a solução ou uma opção alternativa quando você espera que uma parte do seu script produza uma exceção. Geralmente é usado em uma breve configuração ou seção de verificação em que você não quer que determinados erros fiquem ocultos.
Observação: No bloco try-except, você pode usar o else depois de todas as declarações except.
Exemplo simples
Estamos adicionando a instrução else ao exemplo ZeroDivisionError. Como podemos ver, quando não há exceções, a função de impressão na instrução else é executada, exibindo o resultado.
try:
result =1/3except ZeroDivisionError as err:print(err)else:print(f"Your answer is {result}")Tecnologia
A palavra-chave finally no bloco try-except é sempre executada, independentemente de haver ou não uma exceção. Em palavras simples, o bloco de código finally é executado depois que o bloco try, except e else é finalizado. É bastante útil para limpar recursos e fechar o objeto, especialmente para fechar os arquivos.
A função divide foi criada para tratar as exceções do ZeroDivisionError e exibir o resultado quando não houver exceções. Não importa qual seja o resultado, ele sempre será executado em finally para imprimir "Code by DataCamp" na cor verde.
defdivide(x,y):try:
result = x/y
except ZeroDivisionError:print("Please change 'y' argument to non-zero value")except:print("Something went wrong")else:print(f"Your answer is {result}")finally:print("\033[92m Code by DataCamp\033[00m")Tecnologia
No primeiro teste, estamos dividindo 1 por 0, o que deve gerar a exceção ZeroDivisionError e imprimir a mensagem. Como você pode ver, temos uma linha adicional após a mensagem de erro.
Em vez de um número inteiro, adicionamos uma cadeia de caracteres como segundo argumento, o que gerou uma exceção, que é diferente de ZeroDivisionError, com uma mensagem diferente.
Em todos os três cenários, há uma coisa em comum. O código está sempre executando a função de impressão na instrução finally.
Se você é novo no Python e deseja codificar como um programador de verdade, experimente nosso curso de habilidades em programação Python. Você aprenderá a escrever códigos eficientes, funções Python, engenharia de software, testes unitários e programação orientada a objetos.
Tratamento de exceções aninhadas em Python
Precisamos do tratamento de exceções aninhadas quando estamos preparando o programa para tratar várias exceções em uma sequência. Por exemplo, podemos adicionar outro bloco try-except sob a instrução else. Portanto, se a primeira instrução não gerar uma exceção, verifique a segunda instrução com a outra metade do código.
Modificação da função de divisão
Modificamos a função divide do exemplo anterior e adicionamos um bloco try-except aninhado sob a instrução else. Portanto, se não houver AttributeError, você executará o else e verificará o novo código para a exceção ZeroDivisionError.
defdivide(x,y):try:
value =50
x.append(value)except AttributeError as atr_err:print(atr_err)else:try:
result =[i / y for i in x]print( result )except ZeroDivisionError:print("Please change 'y' argument to non-zero value")finally:print("\033[92m Code by DataCamp\033[00m")Tecnologia
No primeiro cenário, fornecemos a lista de quatro valores x e o denominador 3. O script adicionará 50 à lista, dividirá o valor individual na lista por 3 e exibirá o resultado.
Please change 'y' argument to non-zero value
Code by DataCampTecnologia
Exemplo de edição de arquivo
Vamos ver exemplos mais práticos de como carregar o arquivo, escrever um texto e fechar o arquivo.
A função file_editor() permitirá que você acesse o site:
Verifique a exceção FileNotFoundError para a função open().
Se a exceção externa não for levantada, ele verificará a exceção da função write().
Independentemente disso, depois de abrir o arquivo, ele o fechará executando a instrução finally.
Se a instrução try externa gerar a exceção, ela retornará a mensagem de erro com um caminho de arquivo inválido.
deffile_editor(path,text):try:
data =open(path)try:
data.write(text)except:print("Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.")finally:
data.close()except:print(f"{path} file is not found!!")Tecnologia
No primeiro cenário, fornecemos o caminho do arquivo e o texto.
path ="data.txt"
text ="DataLab: Share your data analysis in a cloud-based environment--no installation required."
file_editor(path,text)Tecnologia
A exceção interna é levantada, pois a função write() não é capaz de adicionar o texto.
Unable to write the data. Please add an append:'a'or write:'w' parameter to the open() function.Tecnologia
Para resolver esse problema, precisamos alterar a terceira linha de data = open(path) para data = open(path, 'a'). Isso nos permitirá anexar o novo texto ao arquivo.
Depois de executar novamente a função, adicionamos com êxito o texto ao arquivo.
O tratamento de exceções aninhadas não é recomendado, pois torna o tratamento de exceções mais complexo; os desenvolvedores usam vários blocos try-except para criar um tratamento de exceções sequencial simples.
Observação: você também pode adicionar um bloco try-except aninhado sob a declaração try ou except. Depende apenas de suas necessidades.
Levantamento de exceções em Python
Como desenvolvedor Python, você pode lançar uma exceção se determinadas condições forem atendidas. Ele permite que você interrompa o programa com base em suas necessidades.
Para lançar uma exceção, precisamos usar a palavra-chave raise seguida de um nome de exceção.
Exemplo de erro de aumento de valor
Você pode simplesmente levantar exceções adicionando uma palavra-chave raise na instrução if/else.
No exemplo, aumentamos o endereço ValueError se o valor for superior a 1.000. Alteramos o valor para 2.000, o que fez com que a declaração if fosse TRUE e levantasse ValueError com a mensagem personalizada. A mensagem de erro personalizada ajuda você a descobrir o problema rapidamente.
value =2_000if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Tecnologia
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)---->4raise ValueError("Please add a value lower than 1,000")5else:6print("Congratulations! You are the winner!!")
ValueError: Please add a value lower than 1,000Tecnologia
Exemplo de exceção de aumento
Também podemos gerar qualquer exceção aleatória incorporada ao Python se a condição for atendida. No nosso caso, criamos uma exceção genérica com a mensagem de erro.
if value >1_000:# raise the Exceptionraise Exception("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Tecnologia
---------------------------------------------------------------------------
Exception Traceback (most recent call last)---->3raise Exception("Please add a value lower than 1,000")4else:5print("Congratulations! You are the winner!!")
Exception: Please add a value lower than 1,000Tecnologia
Exemplo de tratamento de exceção levantada
Também podemos criar nossa exceção personalizada e tratar a exceção usando o bloco try-except.
No exemplo, adicionamos um exemplo de erro de valor na declaração try.
Então, como isso funcionará? Em vez de lançar a exceção e encerrar o programa, ele exibirá a mensagem de erro que fornecemos.
value =2_000try:if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")# if false then raise the value errorexcept ValueError as e:print(e)Tecnologia
Esse tipo de tratamento de exceções nos ajuda a nos prepararmos para erros não cobertos pelo Python e que são específicos aos requisitos do seu aplicativo.
O que há de novo no Python 3.10 e 3.11 para o tratamento de exceções?
Alguns novos desenvolvimentos importantes foram adicionados às versões mais recentes do Python, como a 3.10 e a 3.11, desde que a postagem do blog foi originalmente escrita:
1. Correspondência de padrões estruturais no Python 3.10: O Python 3.10 introduziu a correspondência de padrão estrutural, que pode ser usada para tratar exceções de forma mais elegante, fazendo a correspondência de tipos de erro em uma instrução match. Isso é particularmente útil quando você lida com vários tipos de exceção de uma forma mais legível. Exemplo:
try:
result =1/0except Exception as e:match e:case ZeroDivisionError():print("You cannot divide by zero.")case NameError():print("Variable not defined.")case_:print("An unexpected error occurred.")Tecnologia
2. Localizações de erro refinadas em tracebacks (Python 3.11): Os rastreamentos no Python 3.11 agora mostram os locais exatos dos erros, facilitando a depuração de exceções.
Python 3.11: Os rastreamentos identificam a subexpressão exata que está causando a exceção:
ZeroDivisionError: division by zero
(1+2)*(3/0)^Tecnologia
3. Grupos de exceções e except* (Python 3.11): O Python 3.11 introduziu grupos de exceções para tratar várias exceções em um único bloco usando except*. Isso é útil para gerenciar código assíncrono ou cenários em que várias exceções podem ser levantadas. Exemplo:
try:raise ExceptionGroup("Multiple errors",[ValueError("Bad value"), TypeError("Bad type")])except* ValueError as ve:print(f"Handling ValueError: {ve}")except* TypeError as te:print(f"Handling TypeError: {te}")Tecnologia
4. add_note método para exceções (Python 3.11): As exceções agora têm um método add_note(), que permite que os desenvolvedores adicionem notas personalizadas às exceções para melhorar a depuração. Exemplo:
try:raise ValueError("Invalid input")except ValueError as e:
e.add_note("This happened while processing user input.")
e.add_note("Consider validating input before processing.")raiseTecnologia
Retorno:
ValueError: Invalid input
Notes:- This happened while processing user input.- Consider validating input before processing.Tecnologia
5. PEP 654: Melhor tratamento de exceções aninhadas: Com os grupos de exceções, as exceções aninhadas agora são mais fáceis de depurar e manipular, especialmente em fluxos de trabalho complexos, como multiprocessamento ou tarefas assíncronas.
Conclusão
Ambos teste unitário e o tratamento de exceções são as partes principais da programação Python que tornam seu código pronto para produção e à prova de erros. Neste tutorial, aprendemos sobre exceções e erros em Python e como lidar com eles. Além disso, aprendemos sobre blocos try-except aninhados complexos e criamos blocos de exceção personalizados com base nos requisitos.
Essas ferramentas e mecanismos são essenciais, mas a maior parte do trabalho é feita por meio de blocos simples try e except. Onde try procura exceções levantadas pelo código e except trata essas exceções.
Se isso for confuso e você não souber por onde começar, conclua nosso curso Introdução às funções em Python para entender o escopo, as funções lambda e o tratamento de erros. Você também pode se inscrever no curso de carreira de programador Python para adquirir habilidades de desenvolvimento de carreira e se tornar um desenvolvedor Python profissional.
Perguntas frequentes
Qual é a diferença entre um erro e uma exceção em Python?⌄
Um erro em Python geralmente é um problema mais grave que impede a continuidade do programa, como um erro de sintaxe, que indica que a estrutura do código está incorreta. Uma exceção, por outro lado, é uma condição que interrompe o fluxo normal do programa, mas pode ser tratada dentro do programa usando blocos try-except, permitindo que o programa continue a ser executado.
Você pode capturar várias exceções em um único bloco try-except?⌄
Sim, o Python permite que você capture várias exceções em um único bloco try-except usando uma tupla de tipos de exceção. Por exemplo: except (TypeError, ValueError):. Isso tratará um TypeError ou um ValueError no mesmo bloco.
Como você pode criar uma exceção personalizada no Python?⌄
Você pode criar uma exceção personalizada definindo uma nova classe que herda da classeExceptionincorporada . Por exemplo:
Qual é a finalidade do bloco else em uma estrutura try-except?⌄
O bloco else será executado se o blocotry não gerar uma exceção. É útil para o código que deve ser executado somente se o blocotry for bem-sucedido, mantendo o código limpo e separando o tratamento de erros do caminho de execução normal.
Por que o bloco finally é importante no tratamento de exceções?⌄
O blocofinally é sempre executado, independentemente de uma exceção ser levantada ou não. Normalmente, é usado para ações de limpeza, como fechar arquivos ou liberar recursos, para garantir que essas ações sejam executadas em todas as circunstâncias.
Como você pode suprimir exceções em Python?⌄
Você pode suprimir exceções usando o gerenciador de contextocontextlib.suppress. Ele permite que você especifique os tipos de exceção que devem ser ignorados. Por exemplo:
from contextlib import suppress
with suppress(FileNotFoundError):open('non_existent_file.txt')Tecnologia
O que acontece se uma exceção não for capturada em um programa Python?⌄
Se uma exceção não for capturada, ela se propagará pela pilha de chamadas e, se não for tratada, encerrará o programa, imprimindo um rastreamento no console que mostra onde a exceção ocorreu.
Você pode levantar novamente uma exceção depois de capturá-la?⌄
Sim, você pode levantar novamente uma exceção usando a instrução raise sem argumentos em um blocoexcept. Isso é útil quando você deseja registrar um erro ou executar algumas outras ações antes de permitir que a exceção se propague ainda mais.
Existe uma maneira de lidar com todas as exceções em Python?⌄
Embora seja possível capturar todas as exceções usando uma cláusulaexcept:simples , isso geralmente não é recomendado porque pode capturar exceções inesperadas e dificultar a depuração. É melhor você capturar exceções específicas ou usar except Exception: para evitar a captura de exceções que saem do sistema, como SystemExit e KeyboardInterrupt.
Como você diferencia entre um erro de sintaxe e exceções de tempo de execução em termos de quando elas ocorrem?⌄
Os erros de sintaxe são detectados no momento da compilação, o que significa que o interpretador Python detecta esses erros antes que o programa comece a ser executado. As exceções de tempo de execução ocorrem durante a execução do programa quando o interpretador encontra uma operação que não pode realizar, como dividir por zero ou acessar uma variável inexistente.
Sou um cientista de dados certificado que gosta de criar aplicativos de aprendizado de máquina e escrever blogs sobre ciência de dados. No momento, estou me concentrando na criação e edição de conteúdo e no trabalho com modelos de linguagem de grande porte.
Aumente o nível de suas habilidades em Python com estes cinco desafios de codificação em Python. Faça um teste para ver se você consegue completar um em uma semana!
Descubra o poder e a versatilidade de Python neste guia completo. Da história e popularidade às aplicações práticas e um passo a passo de aprendizado, saiba tudo para dominar Python e impulsionar sua carreira em programação.
Aprenda sobre as ferramentas Python essenciais para o desenvolvimento de software, raspagem e desenvolvimento da Web, análise e visualização de dados e aprendizado de máquina.
Erros e exceções podem levar a um comportamento inesperado ou até mesmo interromper a execução de um programa. O Python fornece várias funções e mecanismos para lidar com esses problemas e melhorar a robustez do código. Neste tutorial, você aprenderá sobre vários tipos de erro e funções internas com exemplos.
Um erro é um problema em um programa que o impede de concluir sua tarefa. Em comparação, uma exceção é uma condição que interrompe o fluxo normal do programa. Tanto os erros quanto as exceções são um tipo de erro de tempo de execução, o que significa que ocorrem durante a execução de um programa.
Em palavras simples, o erro é um problema crítico que um aplicativo normal não deve detectar, enquanto uma exceção é uma condição que um programa deve detectar.
Vamos aprender mais sobre erros e exceções observando vários exemplos. Para executá-los com facilidade, você pode criar gratuitamente uma pasta de trabalho do DataLab que tenha o Python pré-instalado e contenha todos os exemplos de código.
Erros em Python
Aqui está um exemplo de um erro de sintaxe em que um retorno fora da função não significa nada. Não devemos lidar com erros em um programa. Em vez disso, devemos criar uma função que retorne a string.
Criamos a função, mas com o recuo errado. Não devemos tratar erros de indentação em tempo de execução. Você pode fazer isso manualmente ou usar ferramentas de formatação de código.
Exceções em Python
Encontramos um
ZeroDivisionError(Exceção). Você pode lidar com isso em tempo de execução usando os blocostryeexcept.NameErrorAs exceções são bastante comuns quando uma variável não é encontrada. Também podemos tratar a exceção substituindo a variável ou imprimindo o aviso.Exceções integradas do Python
Aqui está a lista de exceções padrão do Python com descrições:
AssertionError: gerado quando a instrução assert falha.EOFError: gerado quando a funçãoinput()atende à condição de fim de arquivo.AttributeErrorQuando a atribuição de atributo ou a referência falhar.TabErrorQuando você não tem acesso a um recuo, o que acontece é que o recuo consiste em tabulações ou espaços inconsistentes.ImportError: gerado quando a importação do módulo falha.IndexErrorOcorre quando o índice de uma sequência está fora do intervaloKeyboardInterruptQuando o usuário digita teclas de interrupção (Ctrl + C ou Delete).RuntimeErrorOcorre quando um erro não se enquadra em nenhuma categoria.NameErrorQuando uma variável não é encontrada no escopo local ou global.MemoryErrorQuando você está em um programa, o que você está fazendo?ValueErrorOcorre quando a operação ou função recebe um argumento com o tipo correto, mas com o valor incorreto.ZeroDivisionError: gerado quando você divide um valor ou uma variável por zero.SyntaxError: levantado pelo analisador quando a sintaxe do Python está errada.IndentationErrorOcorre quando há um recuo errado.SystemErrorErro interno: gerado quando o interpretador detecta um erro interno.Você pode encontrar uma lista completa de erros e exceções no Python lendo a documentação.
Aprenda sobre exceções em Python fazendo nosso curso Programação orientada a objetos em Python. Ele ensinará a você como criar classes e aproveitar a herança e o polimorfismo para reutilizar e otimizar o código.
Tratamento de exceções com try, except, else e finally
Depois de aprender sobre erros e exceções, aprenderemos a lidar com eles usando os blocos
try,except,elseefinally.Então, o que queremos dizer com lidar com eles? Em circunstâncias normais, esses erros interromperão a execução do código e exibirão a mensagem de erro. Para criar sistemas estáveis, precisamos prever esses erros e apresentar soluções alternativas ou mensagens de aviso.
Nesta seção, aprenderemos o que cada bloco faz e como podemos usá-los para escrever um código robusto.
A instrução try e except
A maneira mais simples de lidar com exceções em Python é usar o bloco
tryeexcept.try.except.Em vez de parar em um erro ou exceção, nosso código seguirá para soluções alternativas.
Exemplo simples
No primeiro exemplo, tentaremos imprimir a variável indefinida
x. Em circunstâncias normais, ele deve lançar o erro e interromper a execução, mas com o blocotryeexcept, podemos alterar o comportamento do fluxo.try.xnão está definido, portanto, você executará a instrução except e imprimirá o aviso.Exemplo de instrução Multiple except
No segundo exemplo, usaremos vários comandos
exceptpara tratar vários tipos de exceções.ZeroDivisionErrorfor levantada, o programa imprimirá "Você não pode dividir um valor com zero".Isso nos permite escrever um código flexível que pode lidar com várias exceções ao mesmo tempo sem quebras.
Carregando o arquivo de exemplo
Agora, vamos dar uma olhada em um exemplo mais prático.
No código abaixo, estamos lendo o arquivo CSV e, quando ele gerar a exceção
FileNotFoundError, o código imprimirá o erro e uma mensagem adicional sobre o arquivodata.csv.Sim, podemos imprimir mensagens de erro padrão sem interromper a execução.
O try com a cláusula else
Você já aprendeu sobre
tryeexcepte agora aprenderá sobre a declaraçãoelse.Quando a instrução
trynão gera uma exceção, o código entra no blocoelse. É a solução ou uma opção alternativa quando você espera que uma parte do seu script produza uma exceção. Geralmente é usado em uma breve configuração ou seção de verificação em que você não quer que determinados erros fiquem ocultos.Observação: No bloco try-except, você pode usar o
elsedepois de todas as declaraçõesexcept.Exemplo simples
Estamos adicionando a instrução
elseao exemploZeroDivisionError. Como podemos ver, quando não há exceções, a função de impressão na instruçãoelseé executada, exibindo o resultado.Exemplo de IndexError com else
Vamos aprender mais criando uma função simples e testando-a em vários cenários.
A função
find_nth_value()tem como argumentosx(lista) en(número de índice). Criamos um blocotry,excepteelsepara tratar a exceçãoIndexError.A lista
xtem quatro valores, e nós os testaremos para o sexto e segundo índices.IndexErrorfoi levantada e você pode ver a mensagem de erro padrão "list index out of range".else.A palavra-chave finally em Python
A palavra-chave
finallyno blocotry-excepté sempre executada, independentemente de haver ou não uma exceção. Em palavras simples, o bloco de códigofinallyé executado depois que o blocotry,excepteelseé finalizado. É bastante útil para limpar recursos e fechar o objeto, especialmente para fechar os arquivos.A função
dividefoi criada para tratar as exceções doZeroDivisionErrore exibir o resultado quando não houver exceções. Não importa qual seja o resultado, ele sempre será executado emfinallypara imprimir "Code by DataCamp" na cor verde.No primeiro teste, estamos dividindo 1 por 0, o que deve gerar a exceção
ZeroDivisionErrore imprimir a mensagem. Como você pode ver, temos uma linha adicional após a mensagem de erro.Quando adicionamos uma entrada válida, ele exibe o resultado executando o bloqueio
elseefinally.Em vez de um número inteiro, adicionamos uma cadeia de caracteres como segundo argumento, o que gerou uma exceção, que é diferente de
ZeroDivisionError, com uma mensagem diferente.Em todos os três cenários, há uma coisa em comum. O código está sempre executando a função de impressão na instrução
finally.Se você é novo no Python e deseja codificar como um programador de verdade, experimente nosso curso de habilidades em programação Python. Você aprenderá a escrever códigos eficientes, funções Python, engenharia de software, testes unitários e programação orientada a objetos.
Tratamento de exceções aninhadas em Python
Precisamos do tratamento de exceções aninhadas quando estamos preparando o programa para tratar várias exceções em uma sequência. Por exemplo, podemos adicionar outro bloco try-except sob a instrução
else. Portanto, se a primeira instrução não gerar uma exceção, verifique a segunda instrução com a outra metade do código.Modificação da função de divisão
Modificamos a função
dividedo exemplo anterior e adicionamos um bloco try-except aninhado sob a instruçãoelse. Portanto, se não houverAttributeError, você executará oelsee verificará o novo código para a exceçãoZeroDivisionError.No primeiro cenário, fornecemos a lista de quatro valores
xe o denominador 3. O script adicionará 50 à lista, dividirá o valor individual na lista por 3 e exibirá o resultado.A função foi executada com êxito sem gerar nenhuma exceção.
Em vez de uma lista, fornecemos um número inteiro para o primeiro argumento, o que gerou
AttributeError.No último cenário, fornecemos a lista, mas 0 é o segundo argumento que gerou a exceção
ZeroDivisionErrorno comandoelse.Exemplo de edição de arquivo
Vamos ver exemplos mais práticos de como carregar o arquivo, escrever um texto e fechar o arquivo.
A função
file_editor()permitirá que você acesse o site:FileNotFoundErrorpara a funçãoopen().write().finally.No primeiro cenário, fornecemos o caminho do arquivo e o texto.
A exceção externa é levantada.
Para resolver a exceção de arquivo não encontrado, precisamos criar um arquivo
data.txtusando o comandoechodo Linux.Depois disso, execute novamente a função
file_editor().A exceção interna é levantada, pois a função
write()não é capaz de adicionar o texto.Para resolver esse problema, precisamos alterar a terceira linha de
data = open(path)paradata = open(path, 'a'). Isso nos permitirá anexar o novo texto ao arquivo.Depois de executar novamente a função, adicionamos com êxito o texto ao arquivo.
O tratamento de exceções aninhadas não é recomendado, pois torna o tratamento de exceções mais complexo; os desenvolvedores usam vários blocos
try-exceptpara criar um tratamento de exceções sequencial simples.Observação: você também pode adicionar um bloco
try-exceptaninhado sob a declaraçãotryouexcept. Depende apenas de suas necessidades.Levantamento de exceções em Python
Como desenvolvedor Python, você pode lançar uma exceção se determinadas condições forem atendidas. Ele permite que você interrompa o programa com base em suas necessidades.
Para lançar uma exceção, precisamos usar a palavra-chave
raiseseguida de um nome de exceção.Exemplo de erro de aumento de valor
Você pode simplesmente levantar exceções adicionando uma palavra-chave raise na instrução
if/else.No exemplo, aumentamos o endereço
ValueErrorse o valor for superior a 1.000. Alteramos o valor para 2.000, o que fez com que a declaraçãoiffosseTRUEe levantasseValueErrorcom a mensagem personalizada. A mensagem de erro personalizada ajuda você a descobrir o problema rapidamente.Exemplo de exceção de aumento
Também podemos gerar qualquer exceção aleatória incorporada ao Python se a condição for atendida. No nosso caso, criamos uma exceção genérica com a mensagem de erro.
Exemplo de tratamento de exceção levantada
Também podemos criar nossa exceção personalizada e tratar a exceção usando o bloco
try-except.No exemplo, adicionamos um exemplo de erro de valor na declaração
try.Então, como isso funcionará? Em vez de lançar a exceção e encerrar o programa, ele exibirá a mensagem de erro que fornecemos.
Esse tipo de tratamento de exceções nos ajuda a nos prepararmos para erros não cobertos pelo Python e que são específicos aos requisitos do seu aplicativo.
O que há de novo no Python 3.10 e 3.11 para o tratamento de exceções?
Alguns novos desenvolvimentos importantes foram adicionados às versões mais recentes do Python, como a 3.10 e a 3.11, desde que a postagem do blog foi originalmente escrita:
1. Correspondência de padrões estruturais no Python 3.10: O Python 3.10 introduziu a correspondência de padrão estrutural, que pode ser usada para tratar exceções de forma mais elegante, fazendo a correspondência de tipos de erro em uma instrução
match. Isso é particularmente útil quando você lida com vários tipos de exceção de uma forma mais legível. Exemplo:2. Localizações de erro refinadas em tracebacks (Python 3.11): Os rastreamentos no Python 3.11 agora mostram os locais exatos dos erros, facilitando a depuração de exceções.
3. Grupos de exceções e
except*(Python 3.11): O Python 3.11 introduziu grupos de exceções para tratar várias exceções em um único bloco usandoexcept*. Isso é útil para gerenciar código assíncrono ou cenários em que várias exceções podem ser levantadas. Exemplo:4.
add_notemétodo para exceções (Python 3.11): As exceções agora têm um métodoadd_note(), que permite que os desenvolvedores adicionem notas personalizadas às exceções para melhorar a depuração. Exemplo:5. PEP 654: Melhor tratamento de exceções aninhadas: Com os grupos de exceções, as exceções aninhadas agora são mais fáceis de depurar e manipular, especialmente em fluxos de trabalho complexos, como multiprocessamento ou tarefas assíncronas.
Conclusão
Ambos teste unitário e o tratamento de exceções são as partes principais da programação Python que tornam seu código pronto para produção e à prova de erros. Neste tutorial, aprendemos sobre exceções e erros em Python e como lidar com eles. Além disso, aprendemos sobre blocos try-except aninhados complexos e criamos blocos de exceção personalizados com base nos requisitos.
Essas ferramentas e mecanismos são essenciais, mas a maior parte do trabalho é feita por meio de blocos simples
tryeexcept. Ondetryprocura exceções levantadas pelo código eexcepttrata essas exceções.Se isso for confuso e você não souber por onde começar, conclua nosso curso Introdução às funções em Python para entender o escopo, as funções lambda e o tratamento de erros. Você também pode se inscrever no curso de carreira de programador Python para adquirir habilidades de desenvolvimento de carreira e se tornar um desenvolvedor Python profissional.