Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ajuda com erro

Boa tarde estou tentando rodar este código que valida e formata um CPF, quando coloco um CPF valido é ok mas quando coloco um invalido ou faltando digito aparece um série de erros.

Agradeço pela ajuda desde já,

from validate_docbr import CPF

class Cpf:

    def __init__(self, documento):
        documento = str(documento)
        self.cpf_eh_valido(documento)

    def cpf_eh_valido(self, documento):
        if len(documento) == 11:
            validador_cpf = CPF()
            if validador_cpf.validate(documento):
                self.cpf = documento
                print("CPF valido")
            else:
                print("CPF inserido não é valido")
        else:
            print("Numero de digitos incoretos")

    def __str__(self):
        return self.format_cpf()

    def format_cpf(self):
        mascara = CPF()
        return mascara.mask(self.cpf)

cpf_igor = "54648261909"
objeto_cpf_igor = Cpf(cpf_igor)
print(objeto_cpf_igor)
2 respostas

Oi Igor, tudo bem com você?

Você pode fazer um tratamento de exceções com o Try/Except. As exceções nada são do que um retorno de erro quando ocorre algum comportamento inesperado no seu código. E quando você coloca um cpf inválido ou faltando algum digito o que aparece para você na tela são as exceções que ocorreram no código e os rastros dela(onde ocorreu e quais linhas foram afetadas). O try é para executar um trecho de código perigoso(que tende a lançar uma exceção) e quando ocorre a exceção, o bloco except é chamado. Veja:

try:
    cpf_igor = "546482619009"
    objeto_cpf_igor = Cpf(cpf_igor)
    print(objeto_cpf_igor)
except Exception as error:
    print(error)

Resultado:

Numero de digitos incoretos
'Cpf' object has no attribute 'cpf'

Vamos fazer passo a passo o que está acontecendo no código:

  • Entra no bloco try e tenta executar o que está dentro dele, linha a linha.
  • Na primeira linha temos apenas a atribuição de um número de cpf a uma variável, então tudo certo, não há erro algum.
  • Na segunda linha estamos instanciando a classe Cpf
  • Quando instanciamos a classe Cpf, o que ela faz é:
documento = str(documento)
self.cpf_eh_valido(documento)

Ou seja, na primeira linha irá transformar o parâmetro recebido para str e na segunda linha, chamamos a função que verifica se o cpf é válido.

  • Na função que verifica se o cpf é válido, caso o cpf tenha um tamanho diferente de 11, automaticamente cairá no else e printará: Numero de digitos incorretos. Guarde essa informação.

  • Agora, na terceira linha que está dentro do nosso try, estamos printando o objeto da classe Cpf e quando fazemos isso, internamente o python irá chamar o __str__ da classe Cpf.

  • No __str__ da classe Cpf, ele está invocando a função que formata o cpf. Porém, lembra que na verificação para saber se o cpf é válido caímos direto no else? Com isso, não fizemos atribuição nenhuma do valor do cpf passado como parâmetro. Então, não teremos o atributo: self.cpf. Logo, nos será lançada a exceção: 'Cpf' object has no attribute 'cpf' .

Por isso que quando você digitar algum número de cpf inválido ou alguma quantidade de números incorreta irá apresentar alguns erros. Porém, eles podem ser tratados com o bloco try/except de forma a mostrar apenas o motivo de terem ocorrido e não um trecho gigante com os rastros do mesmo. Tudo bem?

Qualquer dúvida é só falar, estou a disposição. Abraços e bons estudos!

solução!

Muito obrigado Nádia pela resposta bem detalhada.

Valeu abraço,