Primeiras aulas do curso Python 3: entendendo o Tratamento de Erros

Python 3: entendendo o Tratamento de Erros

Primeiros passos com exceções - Introdução

Olá, aluno da Alura. Seja bem-vindo ao curso de Python Exceptions. Eu me chamo Ronald Rodrigues e vou ser o seu instrutor nesta parte, por vezes tão assustadora por estudantes da programação.

Ao decorrer do curso nós vamos ver o que são os erros e as exceções. Um termo intermediário que exige conhecimentos prévios de programação básica e orientação a objetos.

Seremos introduzidos ao uso de algumas palavras reservadas como o “try” e o “except”, além de suas variações como o “else” e “finally”. Conheceremos, por meio de exemplos, diversas classes do Python destinados a exceções como a “ValueError” e “AttributeError”. Além de aprendermos como construir as próprias classes que utilizaremos em uma dinâmica de sistema bancário chamado de “ByteBank”, que nós vamos desenvolver.

Como, por exemplo, “OperacaoFinanceiraError”. Aprendendo no processo sobre outra palavra reservada chamada “raise”, a qual utilizaremos quando quisermos levantar ou propagar exceções no programa. Também vamos aprender a ler as mensagens de erro, retornadas pelo interpretador chamadas de “Traceback”, e entender um pouco melhor como identificar a origem do erro através da pilha de execução.

E por fim veremos o “debugger” nativo do Python e como inspecionar o código Python via linha de comando diretamente no terminal. Recurso imprescindível e poderosíssimo aliado à produtividade.

Ao final do curso você estará mais familiarizado com os erros e as exceções, identificando melhor suas origens, sendo capaz de capturar e tratá-los em tempo de execução, de interagir e observar os comportamentos do programa sem precisar modificar o arquivo de código-fonte, além de um modo elegante de lidar com operação de recursos no Python, utilizando a cláusula “with”.

Vamos lá conhecer esses recursos?

Primeiros passos com exceções - Attribute Error

Nada melhor para entender do que pôr a mão na massa em um projeto real para ver as coisas acontecerem. Para isso, iniciaremos um projeto prático chamado de “ByteBank”. Pense que você está criando a parte informatizada de um banco, cujo cliente chegou solicitando os serviços.

Ele quer que os clientes do banco consigam usar a aplicação que você está fazendo para efetuarem transações bancárias entre contas correntes e que no fim, um arquivo com informações importantes seja lido pela mesma aplicação. Vamos criar um arquivo chamado “main.py”, e nele criar as classes para representar as entidades. Vamos definir a classe “Cliente” primeiro.

Agora nós vamos definir o método inicializador. O “Cliente” não tem nada ainda. Nós podemos agora adicionar algumas características para ele. Como, por exemplo, o “nome”, “cpf” e “profissao”. Agora nós fazemos as atribuições padrões. Perfeito. Para desencargo de consciência, vamos testar o que escrevemos. Criaremos um cliente qualquer utilizando a classe.

Nós podemos criar um objeto “cliente” que recebe a chamada da classe “Cliente” com o nome de “Jhon Doe”, por exemplo. Um CPF como “123,456,789-00”, por exemplo, e a profissão como “Desenvolvedor”, excelente. Agora nós podemos imprimir isso e dentro do próprio VS Code, nós podemos usar o Terminal Integrado dele e chamar o script de “main.py”. Olhe só, execelente.

Ele imprimiu para nós o nome, o CPF e a profissão dele. Também há uma maneira interessante de nós imprimirmos tudo isso junto. Nós podemos usar um método mágico chamado “dict”. Por exemplo, “print(cliente.dict)”. Olhe só, ele imprime para nós também. É uma forma de deixar isso mais bonito com o módulo padrão “print fire”. “from pprint Import pprint”. Ok.

Nós chamamos em vez do “print” padrão, nós podemos chamar o “pprint” e usar uma largura de indentação para “40”, eu gosto desse valor, e nós podemos ter uma impressão mais amigável, sem precisar escrever dessa maneira. Apenas para visualização. Nós podemos fazer isso. Vimos os atributos sendo mostrados, até aqui tudo normal, porém, cuidado!

E se tentássemos printar algo que não existe para o cliente, escrevendo um atributo que não definimos na classe, o que aconteceria? Vamos tentar fazer isso. Vamos tentar imprimir “cliente.idade”, por exemplo. Temos então na execução do script, uma mensagem de “traceback”. O “traceback” está dando para nós um “AttributeError”, dizendo que o objeto “cliente”, do tipo “Cliente”, não possui um atributo idade, e se o inverso acontecesse?

E se nós tentássemos atribuir um valor a um objeto que nós não definimos na classe “Cliente”? Por exemplo, se em vez de printarmos a idade, nós definíssemos uma atribuição para o elemento “idade”. Por exemplo, “20” anos, executamos e olhe só que interessante. Não só não deu mais a mensagem de erro, como agora o objeto cliente possui um atributo “idade”, então nenhum erro.

O Python acaba de criar no objeto “Cliente” o atributo “idade”. É interessante ressaltar que agora o objeto possui esse atributo, então cuidado com esse comportamento padrão de estático para leitura e dinâmico para escrita da linguagem se você não deseja.

Partiremos na próxima aula para criação da classe “ContaCorrente”.

Primeiros passos com exceções - Conhecendo Exceções

Vamos começar a criar a classe “ContaCorrente”. Definimos então a classe da seguinte maneira: eu tenho um “scope” já criado para nós, e a classe “ContaCorrente” possui os métodos “def transferir(self, valor, favorecido):”, “def sacar(self, valor):” e “def depositar(self, valor):”, e os atributos como “saldo”, “agencia”, “cliente” e “numero”.

Também foi declarado uma propriedade estática que nos servirá como um contador global para contar as quantidades de instâncias da “ContaCorrente”, que é o total de contas criadas. Essa variável será incrementada no construtor da classe, toda vez que um novo objeto do tipo “ContaCorrente” for instanciado, que é o que nós fazemos na linha 18, porém, há uma demanda que surgiu para o sistema: implementar uma taxa de operação para todos os clientes do ByteBank.

Ou seja, essa taxa é calculada baseada na quantidade de contas correntes existentes no banco, portanto ela não é uma taxa fixa. Nós já temos o contador de contas correntes criadas. O que é uma característica de classe, ou seja, compartilhada entre todos os objetos do tipo “ContaCorrente”. O que precisamos agora é usar essa propriedade para calcular a taxa de operação, que também será uma propriedade compartilhada entre todos os objetos.

A final de contas, todas as contas irão ter que saber qual é o valor delas. Qual é essa taxa de operação? Definimos, então, a taxa de operação no escopo de variáveis de classe e no construtor “init” refletimos essa mudança. Vamos fazer aqui embaixo de total de contas criadas: “taxa_operação”, o valor inicial nós podemos definirmos como “None”, ou seja, sem valor válido.

Inicialmente, a taxa será a divisão do total de contas criadas por 30, e por se tratar de uma taxa dinâmica, seu valor precisa ser atualizado no construtor, então vamos fazer isso. Ele vai receber a divisão de 30 pela quantidade de contas criadas.

Agora, criamos um objeto do tipo “ContaCorrente” para testarmos as funcionalidades da classe. Deixe-me fechar esse tipo e agora vamos criar um objeto. Ele já começa a pedir os parâmetros. O VS Code consegue ter essa inteligência e mostrar para nós o que o construtor espera.

Ele pede um objeto do tipo “Cliente”. Nós não vamos trabalhar com essa funcionalidade agora. Vamos adicionar “None”. Na agência, nós podemos colocar um valor simbólico como “00” e a mesma coisa para o número da conta. Podemos colocar um “01”, e agora vamos executar no terminal.

Vamos chamar o script, o “main.py”, e veja só. Nós temos o contato com uma exceção do tipo “ZeroDivisionError”, divisão por zero. Lendo com cautela o “traceback”, vemos que o erro está na linha de código que é feita a operação de divisão, de taxa de operação que é 30 dividido pelo total de contas criadas.

Parando para pensar, realmente faz sentido porque na primeira criação de um objeto, o total de contas criadas é “0”, então nós estamos fazendo uma divisão de 30 por 0. Isso nós conseguimos resolver facilmente, mudando a lógica da programação, ou seja, nós só invertemos a ordem das coisas. O que é mais lógico.

Nós incrementamos o total de contas criadas primeiro, para depois fazermos a divisão. Se nós voltarmos no Terminal Integrado, dentro do VS Code, ele não vai mais dar erro para nós. Eu tenho um diagrama para mostrar, para nós percebermos melhor o que pode ter acontecido.

Primeiramente, ocorreu uma operação. O interpretador pegou essa operação e tentou. Posso processar isso, sim ou não? No caso de sim, ele nos daria o resultado da operação e chamaria a próxima em sequência.

No caso, como ele não conseguiu processar, ele teve que disparar uma exceção, e no nosso caso, como ela não foi tratada, houve a abortagem do sistema. Como você deve ter percebido, o código estar preparado para erros é importante para sua execução.

Vamos ver outras formas de erros e como podemos tratar esses problemas, mais adiante.

Sobre o curso Python 3: entendendo o Tratamento de Erros

O curso Python 3: entendendo o Tratamento de Erros possui 174 minutos de vídeos, em um total de 41 atividades. Gostou? Conheça nossos outros cursos de Python em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Python acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas