Capa
Seções
NOTÍCIAS

DOWNLOAD

ANÁLISES

COMPRAS

BOLETIM

WIRED NEWS

IDG NOW!

PC WORLD

AJUDA

COLUNISTAS


 digite + enter


UM PROGRAMA MAIS TOLERANTE
Luciano Ramalho MAGNET

Um defeito das nossas somadoras, e de todos os programas que fizemos até agora, é que eles não toleram falhas na digitação. Se você rodar o programa somadora2.py e digitar apenas [Enter] para encerrar, verá a seguinte mensagem na tela:

 Traceback (innermost last):
       File 'somadora1.py', line 7, in ?
  n = float(raw_input())
 ValueError: empty string for float()

A segunda linha dessa mensagem identifica o local do erro: linha 7 do arquivo (file) somadora1.py. Na terceira linha está reproduzida a linha do programa onde ocorreu o problema, e a mensagem final informa qual foi o erro. Podemos traduzí-la assim: "Erro de valor: string vazia para a função float()".

O problema é que, ao digitarmos [Enter] sem fornecer um número, a função raw_input() retorna uma string vazia (nada mais justo, pois nada foi digitado). Em seguinda, a função float() tenta transformar a string vazia em um ponto flutuante, mas não sabe como. É ela que dispara a mensagem de erro, fazendo com que o programa seja interrompido antes de mostrar o valor total da soma.

Efeito semelhante pode ser obtido se você digitar um texto qualquer em vez de um número. Experimente.

Nesse caso, a mensagem de erro final é: "ValueError: invalid literal for float(): blah". Nesse caso, a reclamação é de "invalid literal", significando que o texto fornecido para a função float() não se parece com um número.

A melhor maneira de resolver esse problema envolve o uso de mais uma comando de bloco de Python: o conjunto try/except (tentar/exceto). Esse par de palavras-chave formam o mecanismo de "tratamento de exceções" de Python, algo que só se encontra em linguagens bastante modernas como Java e as versões mais recentes de C++. A idéia básica é simples: no caso da nossa somadora, vamos tentar (try) converter a string digitada em float; se isso não der certo, temos uma exceção, que deve ter tratamento especial. No nosso caso, vamos simplesmente acionar o comando break para interromper o loop e exibir a totalização.

Veja na listagem 5 como fica a somadora3.py, agora com tratamento de exceções.

Listagem 5

  1 # somadora3.py - somadora infinita - versao 3
  2
  3 print 'Digite os valores a somar seguidos de .'
  4 print 'Para encerrar apenas .'
  5	total = 0
  6	while 1:
  7     try:
  8         n = float(raw_input(':'))
  9         total = total + n
 10     except:
 11         break
 12 print 'TOTAL: %s' % total

Vamos comentar apenas as diferenças em relação à versão anterior:

Linha 4: mudamos a mensagem para o usuário, já que agora basta um [Enter] para encerrar.

Linha 7: início do bloco try: tentaremos executar as linhas 8 e 9. Qualquer erro que ocorrer aqui será tratado no bloco except.

Linha 8: aqui é o local mais provável do erro, quando float() tenta converter o resultado de raw_input().

Linha 9: se ocorrer um erro na linha 8, a linha 9 não será executada porque, dentro do bloco try qualquer erro causa a transferência imediata da execução para o bloco except correspondente.

Linha 10: início do bloco except associado ao bloco try da linha 7

Linha 11: tratamento do erro: em caso de exceção, vamos simplesmente interromper o loop com um comando break.

Linha 12: como esta linha vem logo após um loop infinito (while 1), a única forma de chegarmos aqui é através de um break. Ou seja, nesse caso o loop só termina em conseqüência de uma exceção.

Experimente o programa agora: ele ficou muito mais conveniente de usar. Para interromper a soma e obter o total, basta teclar [Enter] em uma linha em branco. Uma boa melhoria na "usabilidade" da somadora!

» Como tratar um erro de verdade »

Copyright © 1999 MAGNET
Introdução

Somadora infinita

Mais sobre o while

Loops (quase) infinitos

Um programa mais tolerante

Como tratar um erro de verdade

Associação de nomes a valores

Resolvendo o Orçamento da República

Nossa primeira simulação

Copyright© 1996 - 2003 Terra Networks S.A. Todos os direitos reservados. All rights reserved.