2011-01-20 3 views
1

Для простого фрагмента кода нижеПомощи с обработкой ошибок для Python

a = raw_input("Enter a number: ") 

Как я могу написать исключение такого, что если строка будет введена, пользователь вновь будет предложен снова и снова пытаться, пока целое не будет вошел.

Другими словами, продолжайте делать это до тех пор, число не будет введено .:

if a.isdigit == False: 
    raw_input("Try again: ") 
+0

мой ответ никакой пользы для вас я буду удалять его, если вы хотите только положительные числа не выбрать один из ответов, которые используют 'isdigit()', надеюсь, что я сделал помочь в этот раз:) – mouad

+0

Я думаю, что мой вопрос был плохо сформулирован, что смутил всех -_-. Спасибо за вашу помощь! – super9

ответ

2

Обычный способ для достижения этой цели является использование int() с обработкой исключений:

>>> n = None 
>>> while n is None: 
... a = raw_input("Enter a number: ") 
... try: 
...  n = int(a) 
... except ValueError: 
...  print "Not a number." 
... 
Enter a number: abc 
Not a number. 
Enter a number: cauliflowers are my favourite vegetable 
Not a number. 
Enter a number: 12 
>>> 

Однако, если вы предпочитаете, чтобы избежать обработки исключений вы можете принять следующий подход. Обратите внимание, что оно не принимает отрицательные числа, а только натуральные числа 0, 1, 2, ..., N:

>>> while True: 
... a = raw_input("Enter a number: ") 
... if a.isdigit(): 
...  break 
... print "Not a number." 
... 
Enter a number: I like beetroot too 
Not a number. 
Enter a number: -500 
Not a number. 
Enter a number: 500 
>>> 

Это становится немного сложнее обрабатывать отрицательные числа таким образом, требуя три случая, один для пустых строк, один для отрицательных чисел и один для натуральных чисел:

>>> while True: 
... a = raw_input("Enter a number: ") 
... if len(a) > 0 and ((a[0] == '-' and a[1:].isdigit()) or a.isdigit()): 
...  break 
... print "Not a number." 
... 
Enter a number: Celery stinks. 
Not a number. 
Enter a number: 
Not a number. 
Enter a number: - 
Not a number. 
Enter a number: 1 
>>> 
+0

Есть ли веская причина использовать 'try ... except'? Если добавление 'int (a)> 0' условие было добавлено к ответам, которые вы остановили, не заставит ли их решение также действовать? – super9

+0

@Nai В ответ на ваш первый вопрос требуется 'try ... except', потому что' int (a) 'возвращает целое число, а не логическое, и использует исключения, чтобы сигнализировать случай, когда он имеет дело со строкой, которая не является действительным целым числом. Вот почему добавление 'int (a)> 0' в ответы' isdigit' недостаточно, так как 'int' будет генерировать исключение, если столкнутся с не целой строкой, представляющей строку. – fmark

+0

@Nai Сказав это, если вы хотите найти только натуральные числа ('0, 1, 2, ..., N'), а не целые числа (' -N, ..., -2, -1, 0 , 1, 2, ..., N') Я бы порекомендовал обновить ваш вопрос и воспользовался ответами Jeff или Michaels ниже. – fmark

1

Вы можете использовать while цикл:

a = "" 
while not a.isdigit(): 
    a = raw_input("Enter a number: ") 

Если вы хотите сообщение об ошибке, это становится чем-то вроде:

a = raw_input("Enter a number: ") 
while not a.isdigit(): 
    a = raw_input("Try again: ") 
+1

-1 Это приведет к сбою отрицательных целых чисел. – fmark

+0

@fmark Я думаю, это подразумевает, что он означает натуральные числа; он использовал '.isdigit' прямо в своем вопросе ... –

+0

+1, OP хочет, чтобы он завершился с ошибкой для отрицательных целых чисел. – mouad

0
a = raw_input("Enter a number: ") 
while (not a.isdigit()): 
    a = raw_input("Try again: ") 
+0

-1 Это не получится с отрицательными целыми числами. – fmark

+0

+1, OP хочет, чтобы он сбой для отрицательных целых чисел – mouad

1
while True: 
    a = raw_input("Enter a number:") 
    try: 
     i = int(a) 
     break 
    except ValueError: 
     print "Not a number" 
Смежные вопросы