image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Ricardo Francisco
Ricardo Francisco08/01/2024 16:34
Compartilhe

Pretensa anatomia de uma função — Parte II

    Retomando o artigo anterior, estamos no ponto onde, graças ao uso de estruturas de verificação (if/elif/else) começamos a dar uma tratativa aos possíveis erros de código no uso da função.

    Porém, ao digitarmos um numero inválido, nosso código retorna apenas que o numero é inválido, e encerra sua execução…

    image

    Sim, eles estão de volta!

    (2) Função 3 — YouTube

    4. Tratamento de erros, com loops e condições de parada: Provavelmente, esse é um comportamento indesejado para a função. Você poderia pensar que os dedos de salsich… er.. que seus usuários podem, simplesmente cometerem um erro de digitação, e não precisarem ter de abrir novamente a execução do código, havendo apenas a necessidade de uma rotina que fiscalize essa entrada até que ela esteja correta.

    Para isso, temos como opção o uso de estruturas de repetição, que nada mais são que

    Lembrando que, em Python, as opções são whileque serve para quando ‘temos um determinando numero de vezes para executarmos uma rotina, e trabalha para se repetir até que uma condição seja atendida’; nem como a sdua contraparte, que atua quando se tem um numero sabido de repetições, for. Logicamente, ele trabalha com uma ideia de ‘enquanto algo é verdadeiro, responda com uma ação”.

    No nosso caso, queremos que o código verifique a entrada até que ela esteja correta, pra depois prosseguir, o que se encaixa no conceito de while. E, para tanto, temos de criar uma variável que verifique a entrada, e se altere com ela,. Tal alteração pode ser implementada no if/else já existente, e ele é essencial para evitar um loop infinto.

    image

    Pow, mas eu gosto tanto do canal dos caras...

    Não, não esse. No caso o loop infinto ao qual me refiro é a execução de uma linha de código infinitamente, devido a uma condição que nunca se altera, ou que se altera, mas não chega nem perto do ponto de parada, como por exemplo um código que deve se repetir até chagar a zero, mas que faz uma contagem progressiva e inicia depois de zero.

    image

    Preso pela eternidade...

    (2) Função 4 — YouTube

    Por isso, além de pensarmos em qual dos loops devemos utilizar, devemos checar suas condicionais para execução e parada.

    image

    E o código QUASE saindo da Carbonita...

    (2) Funçoes 5 — YouTube

    Mas. o que acontece se o usuário tenta ESCREVER POR EXTENSO o número, ao invés de digitá-lo?

    (E, sim, você conhece ao menos uma pessoa que faria isso, não)?

    image

    Funçoes 6— YouTube

    5. Tratamento de erros — exceções: Sempre vai acontecer, e sempre haverá alguém disposto a desafiar a lógica. E pra isso existem os tratamentos de exceção. que, no Python, são tratados com “try” e “except”. Pontos a considerar:

    • try devera entrar logo antes da ocorrência do erro. No nosso caso, o erro ocorre justamente por causa da verificação contida em nosso if, logo, o try deverá entrar antes dele, além de se corrigir toda a indentação do código. Ele assinalará o que deve ser tentado e verificado por essa condicional;
    • De maneira análoga, except determina o que acontece se ocorrer uma exceção ao try, e também segue sua identação, porém, ele vem logo a seguir do final do bloco de try;

    Por fim, é importante lembrar que essa tratativa só é suficiente para um único tipo de erro, por isso, se faz necessário saber exatamente o tipo de erro, sendo uma boa prática declará-lo em except. Podemos qualificar as exceções em:

    • NameError: Você está tentando usar uma variável que não existe no ambiente atual. Confira se o nome está escrito corretamente e de forma consistente. E lembre-se de que as variáveis locais são locais; você não pode se referir a elas a partir do exterior da função onde são definidas.
    • TypeError/ValueError: Você está tentando usar um valor de forma inadequada. Exemplo: indexar uma string, lista ou tupla com algo diferente de um número inteiro OU;
    • Não há correspondência entre os itens em uma string de formatação e os itens passados para conversão. Isso pode acontecer se o número de itens não tiver correspondência ou uma conversão inválida for chamada OU
    • Você está passando o número incorreto de argumentos a uma função. Para métodos, olhe para a definição do método e verifique se o primeiro parâmetro é self. Então olhe para a invocação do método; confira se está invocando o método a um objeto com o tipo correto e fornecendo os outros argumentos corretamente.
    • KeyError: Você está tentando acessar um elemento de um dicionário usando uma chave que o dicionário não contém. Se as chaves forem strings, lembre-se de que letras maiúsculas são diferentes de minúsculas.
    • AttributeError: Você está tentando acessar um atributo ou método que não existe. Verifique a ortografia! Você pode usar a função integrada vars para listar os atributos que existem mesmo. Se um AttributeError indicar que um objeto é do tipo NoneType, fica subentendido que é None. Então o problema não é o nome do atributo, mas o objeto. Pode ser que o objeto seja none porque você se esqueceu de retornar um valor de uma função; se chegar ao fim de uma função sem chegar a uma instrução return, ela retorna None. Outra causa comum é usar o resultado de um método de lista, como sort, que retorne None.
    • IndexError: O índice que você está usando para acessar uma lista, string ou tupla é maior que o seu comprimento menos um. Imediatamente antes do local do erro, acrescente uma instrução print para exibir o valor do índice e o comprimento do array. O array é do tamanho certo? O índice tem o valor certo?

    Lembrando que o Depurador do Python (PDB) é útil para rastrear exceções porque permite examinar o estado do programa imediatamente antes do erro. Você pode ler sobre o pdb aqui.

    image

    Et voilà!

    (2) Funçoes 7— YouTube

    Por fim, temos o código arrumado! Espero que tenha sido útil.

    Uma consulta rápida foi feita nos livros “Pense em Python”, de Allen B. Downey, que pode ser lido aqui. E também no livro de Joel Grus, “Data Science do Zero”.
    Compartilhe
    Comentários (0)