Python - duvida quanto ao tratamento de erros [Solucionado]

Iniciado por HDD_Man, 26 de Fevereiro de 2012, 19:23

tópico anterior - próximo tópico

HDD_Man

Ola pessoal!

estou estudando pyhton, dai fiquei pensando na tratativa de erros causados pelos usuários, e como resolve-los.
como ainda sou iniciante, provavelmente ainda não cheguei nisso pelos artigos que estou estudando. mas eles estão se aprofundando e não trataram essas questões meio básicas, dai estou travado nisso.

exemplo:
a = raw_input ("Digite um numero")
#a pessoa vai la e digita uma letra.

isso eu aprendi resolver aqui:
http://www.rodrigor.com.br/disciplinas/2010.1/introprog/material/string-checar_inteiro_float

agora, ficou uma ultima duvida..

como eu faço pro programa não terminar??

exemplo:
você digita a letra ao invés do número, daí ele avisa que não é número. Mas dai ele dá um Break!!
Mas pela lógica, ele precisa retornar ao começo do teste, e realizá-lo até que o usuário "aprenda" a digitar o número!


Como faço isso?


Obrigado desde já!


Darcamo

Em python ao invés de checar uma coisa é possível e depois executá-la, acho que é mais comum vc simplesmente tentar executá-la e tratar a exceção caso isso não seja possível. Por exemplo

from exceptions import ValueError

idade = -1

while idade < 0:
    idade = input("Digite sua idade\n")

    # Tenta interpretar a idade fornecida como um número válido. Caso não
    # seja possível seta a idade como -1 para continuar no laço while.
    try:
        idade = int(idade)
    except ValueError:
        idade = -1

print("Sua idade é {0}".format(idade))

HDD_Man

pessoal, não sei, acho que não me expressei muito bem. Por outro lado, deu pra ver o quao criativo o ser humano pode ser ao inventar um codigo para um teste como esse. Varios jeitos! Muito interessante!

o teste em si, com esse codigo, ja resolvia

idade_str = input("Digite sua idade")
if idade_str.isdigit():
    print("idade é um número inteiro válido")
else
    print("idade não é um número inteiro")
>>>

mas, vejam acima: o programa acabou!
eu nao quero que acabe!
quero que ele fique pedindo pra pessoa ate ela digitar um numero valido!!! (um float)



pelo que me lembro, tem uma função que vi no delphi uma vez, chamada goto.
eu vi que não é usada em python e nas linguagens de hoje em dia, mas basicamente, eu queria enviar a execução de volta pro começo, senao o programa acaba!

pela lógica, vejo três jeitos para fazer isso:
1- usar uma função semelhante ao goto para jogar a execução de volta pro começo.
2- executar o programa novamente ao chegar ao fim (uma função que rode o programa novamente)
3- bloquear tudo o que não é numero ou ponto no teclado (já vi isso, mas acho que ainda nao é pra mim).

enfim, alguem poderia me dar uma luz? prefiro a opção 1, mas pode ser que eu nao esteja entendendo a logica de maneira correta...

resumindo:
o programa deveria continuar com o teste até a pessoa digitar um numero valido


Obrigado a todos!!

Darcamo

O código que eu postei faz isso. Caso a idade seja inválida, seja porque é negativa ou porque ele não conseguiu interpretar como um número inteiro (mude "int" para "float", já que você quer float).

A ideia é que caso ele não consiga entender a idade fornecida como um número então a linha
idade = int(idade)
vai gerar uma exceção do tipo ValueError. A estrutura "try ... except" vai capturar essa exceção e setar a idade como "-1" exatamente para que o programa não saia do laço while e pergunte a idade novamente. Ou seja, o programa vai pedir a idade novamente se a pessoa digitar uma letra.

irtigor

"goto" não é considerado uma boa prática de programação, por isso não existe em algumas linguagens (principalmente nas mais novas). Entretanto, existe um módulo goto em python (repare que, apesar de alegadamente funcionar, ele foi criado como um piada de 1 de abril).

Em poucas palavras: use um laço.

HDD_Man

Citação de: Darcamo online 29 de Fevereiro de 2012, 01:36
O código que eu postei faz isso. Caso a idade seja inválida, seja porque é negativa ou porque ele não conseguiu interpretar como um número inteiro (mude "int" para "float", já que você quer float).

A ideia é que caso ele não consiga entender a idade fornecida como um número então a linha
idade = int(idade)
vai gerar uma exceção do tipo ValueError. A estrutura "try ... except" vai capturar essa exceção e setar a idade como "-1" exatamente para que o programa não saia do laço while e pergunte a idade novamente. Ou seja, o programa vai pedir a idade novamente se a pessoa digitar uma letra.

Ola pessoal!
acho que nao tinha entendido muito bem entao o codigo do irtigor. eu mudei ele pro meu exercicio dai nao funcionou.
vou estudar melhor o codigo e depois volto a postar.
Obrigado a todos!

HDD_Man

Ola pessoal!

andei estudando uma apostila mais aprofundada e aprendi.

obrigado a todos!