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 »