Tratar erros em Python para facilitar a vida

Você já se deparou com um erro no código e ficou batendo cabeça para saber qual era o erro?
A IDE ou o próprio prompt (>>>) do Python informava uma coisa e depois você descobriu que era outro erro.

Pois é!

Por causa disso, achamos interessante trazer uma estrutura básica para quem está começando a programar em Python.

A estrutura é bem simples e consiste em ter um “try:” antes do seu código fonte e o tratamento após o seu código fonte.

As bibliotecas que serão carregadas devem ficar antes do “try:”.

O desvio para identificação do erro será para erros de sistemas operacionais, erros de valor porque o Python trabalha orientado a objetos e quase tudo é um objeto no python e, por fim, exceções que acontecerem com comportamentos não esperados na execução do programa.

Esse tratamento pode ser melhorado, mas com esse mínimo será possível facilitar muito a vida de quem está programando.

Um ponto de atenção é na indentação, porque como o “try:” fica na primeira coluna, então o seu código fonte deve começar indentado. Eu acho que esse é o único ponto um “pouco chato” de utilizar o tratamento de erro, porque você vai iniciar seu código com a indentação no primeiro nível de indentação, por outro lado, compensa o benefício da rápida identificação do erro.

Vamos ao código!


# Carregue as biblotecas aqui, como pandas, matplotlib, numpy, etc


# Arquivo de exemplo de tratamento de erros
try:

    # <aqui vai o código fonte do seu programa>

except OSError as err:
    #<aqui o tratamento captura o erro de Sistema Operacional>
    print("Erro de S.O. : {0}".format(err))
except ValueError:
    # <aqui  o tratamento captura o erro do programa como valores errados ou parâmetros>
    print("Não pode converter data para inteiro.")
except BaseException as err:
    #<aqui  o tratamento captura as exceções que acontecem no programa>
    print(f"Inesperado {err=}, {type(err)=}")
    raise

Teste esse tratamento de erro!
Copie esse código fonte de tratamento de erro e cole o seu código após o “try:”.

Depois, force erros como mudar caminho de arquivos, “\”, parâmetros, cálculos errados e etc.

A mágica acontecerá e sua vida ficará mais fácil a partir do momento que você iniciar o tratamento de erros.

Com o tempo, esse processo é incorporado ao seu dia a dia.

Boa diversão!

Até a próxima!

Altair Ribeiro

Buscar CEPs com Python e Selenium

Um dos trabalhos apresentados no Encontro da Comunidade no dia 27/05/23 por Altair Ribeiro

Muitas vezes precisamos obter endereços completos para a realização de testes de software, ou ainda para incluir dados em um formulário na Web.
O Selenium é uma biblioteca muito utilizada para testes de software e que pode ser utilizada a realização desse tipo de trabalho repetitivo.

Você precisa ter o geckodriver.exe (baixe aqui) ou o chromedriver.exe (baixe aqui) para que o código fonte em Python em conjunto com a biblioteca Selenium crie uma instância do Browser e controle todo o processo de execução.

Tanto o Geckodriver.exe quanto o Chromedriver.exe precisam estar na mesma pasta do código fonte.

Utilizamos um site muito utilizado por Analistas de Qualidade para a geração de massa de dados.

É um site muito conhecido nesse meio e também muito bem montado e que contribui muito para elevarmos o nível da disciplina de qualidade no Brazil.

É o site www.4devs.com.br!

Vamos ao código fonte.

# importar as bibliotecas necessárias
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random
import re

# Definir a quantidade de endereços que serão gravados no arquivo "ceps.txt"
qtde= 5

# Inclusão de um Try para obter o código de erro em caso de falha do código fonte e o código que será executado
try:
    path_atual = os.getcwd()
    print('path:' , path_atual)

    # driver = webdriver.Chrome()
    driver = webdriver.Firefox()
    driver.maximize_window()

    # URL que será acessada
    url = 'https://www.4devs.com.br/gerador_de_cep'

    driver.get(url)
    time.sleep(2)

    cont = 0

    estado = driver.find_element(By.ID, 'cep_estado')
    estado.send_keys('SP')
    time.sleep(5)

    estado = driver.find_element(By.ID, 'cep_cidade')
    estado.send_keys('Santos')
    time.sleep(5)

    with open("ceps.txt",'a', newline="") as arquivo:
        while cont <qtde:

            submit = driver.find_element(By.ID,'btn_gerar_cep')
            #time.sleep(3)
            submit.click()
            time.sleep(5)
            cep = driver.find_element(By.ID, 'cep')
            cep.click()
            endereco = driver.find_element(By.ID, 'endereco')
            endereco.click()
            bairro = driver.find_element(By.ID, 'bairro')
            bairro.click()
            cidade = driver.find_element(By.ID, 'cidade')
            cidade.click()
            estado = driver.find_element(By.ID, 'estado')
            estado.click()
            time.sleep(5)
            arquivo.write(re.sub("\-","",cep.text) + ';' + endereco.text + ';' + str(random.randint(1,1000)) + ';' + 'ap. ' + str(random.randint(1,100)) + ';' + bairro.text + ';' + cidade.text + ';' +estado.text + '\n')
            cont += 1
            #print(cont , ". ", cep.text + ';' + endereco.text + ';' + str(random.randint(1,1000)) + ';' +  'ap. ' + str(random.randint(1,100)) + ';' + bairro.text + ';' + cidade.text + ';' +estado.text)
            print(cont , ". ", re.sub("\-","",cep.text) + ';' + endereco.text + ';' + str(random.randint(1,1000)) + ';' +  'ap. ' + str(random.randint(1,100)) + ';' + bairro.text + ';' + cidade.text + ';' +estado.text)

    arquivo.close()
    driver.close()

# Tratamentos dos erros para uma melhor identificação em caso de falha
except OSError as err:
    #<aqui vai o erro de Sistema Operacional>
    print("Erro de S.O. : {0}".format(err))
except ValueError:
    # <aqui vai o erro do programa>
    print("Não pode converter data para inteiro.")
except BaseException as err:
    #<aqui vão exceções que aconteçam no programa>
    print(f"Inesperado {err=}, {type(err)=}")
    raise

Se tiver dúvidas no uso do código, entre na comunidade no Telegram (https://t.me/+aLIZYCmBJfH-qPGs).

Até a próxima!