Autor Tópico: Python - duvida quanto ao tratamento de erros [Solucionado]  (Lida 5171 vezes)

Offline HDD_Man

  • Usuário Ubuntu
  • *
  • Mensagens: 89
    • Ver perfil
Python - duvida quanto ao tratamento de erros [Solucionado]
« Online: 26 de Fevereiro de 2012, 19:23 »
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á!
« Última modificação: 02 de Agosto de 2012, 21:37 por HDD_Man »

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil

Darcamo

  • Visitante
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #2 Online: 27 de Fevereiro de 2012, 12:19 »
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

Código: [Selecionar]
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))

Offline HDD_Man

  • Usuário Ubuntu
  • *
  • Mensagens: 89
    • Ver perfil
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #3 Online: 29 de Fevereiro de 2012, 00:28 »
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

  • Visitante
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #4 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
Código: [Selecionar]
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.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #5 Online: 29 de Fevereiro de 2012, 01:46 »
"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.

Offline HDD_Man

  • Usuário Ubuntu
  • *
  • Mensagens: 89
    • Ver perfil
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #6 Online: 29 de Fevereiro de 2012, 07:32 »
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
Código: [Selecionar]
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!

Offline HDD_Man

  • Usuário Ubuntu
  • *
  • Mensagens: 89
    • Ver perfil
Re: Python - duvida quanto ao tratamento de erros causados por usuarios
« Resposta #7 Online: 02 de Agosto de 2012, 21:36 »
Ola pessoal!

andei estudando uma apostila mais aprofundada e aprendi.

obrigado a todos!