Как я могу вызвать ошибку EOF? - PullRequest
0 голосов
/ 29 июня 2018

Я новичок в изучении Python. Пожалуйста, взгляните на приведенный ниже код (Из Структур Данных и Алгоритмов в Python by Goodrich и др.).

age = -1   # an initially invalid choice
while age <= 0:
    try:
        age = int(input('Enter your age in years: '))
        if age <= 0:
            print('Your age must be positive.')
    except ValueError:
        print('That is an invalid age specification.')
    except EOFError:
        print('There was an unexpected error reading input.')
        raise  # let's re-raise this exception.

Я знаю, что такое ValueError. Например, ошибка ValueError возникает, если ввод задается в виде символов, а не целого числа.

С другой стороны, я понятия не имею, когда возникает EOFError.

  1. Я не могу понять, что означает «повторно поднять это исключение»

  2. В книге говорится, что «вызов на ввод вызовет EOFError, если ввод с консоли будет неудачным». Опять же, я понятия не имею, что такое консольный ввод и когда происходит сбой консольного ввода.

Я пробовал несколько способов вызвать EOFError, но каждый раз, когда я пытался, был только ValueError. Кто-нибудь может дать мне какую-то идею?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Из документации input :

Когда читается EOF, EOFError повышается.

EOF отправляется, когда входной поток достигает конца или если он поступает из консоли, это означает, что пользователь нажимает ctrl-D в * NIX или ctrl-Z в Windows.

Вы можете перехватить исключение EOFError и прервать цикл while, чтобы аккуратно завершить программу, поэтому измените свой блок исключения на:

except EOFError:
    print('Done.')
    break
0 голосов
/ 03 декабря 2018

Если вы хотите поднять Следующий код создаст SyntaxError, EOF в Python:

print ("Где сейчас EOF?")

это тест, чтобы увидеть, где происходит EOF ... подозреваю, что это будет строка 4 EOF

print («Привет, мир!»

Я не уверен, что это то, что вы подразумеваете под «поднять ошибку». Создает новый пост в StackOverflow

0 голосов
/ 29 июня 2018

Вы поймали исключение, означающее, что Python продолжит цикл, вместо того чтобы позволить исключению просачиваться вверх по стеку, что в конечном итоге приведет к завершению программы, если оно останется необработанным. Вызов raise без аргумента в предложении except просто снова вызывает то же исключение, эквивалентное

except EOFError as exc:
    print("Unexpected error")
    raise exc

Повторное поднятие исключения необходимо, если вы на самом деле не обрабатываете исключение, вместо этого просто добавляете дополнительное ведение журнала до того, как (возможно) кто-то еще его обработает.

Запуск EOFError можно выполнить, запустив

$ python -c 'input()' < /dev/null
Traceback (most recent call last):
  File "<string>", line 1, in <module>
EOFError: EOF when reading a line

, поскольку все попытки чтения из /dev/null выглядят как попытки чтения из конца файла.

...