1

我是一个学习python的新手。请查看以下代码(来自 Goodrich 等人的 Python 中的数据结构和算法)。

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。有人可以给我一些想法吗?

提前致谢。

4

3 回答 3

3

来自input的文档

EOF被阅读时,EOFError被提出。

EOF当输入流到达末尾时发送,或者如果它来自控制台,则表示用户在 *NIX 上按 ctrl-D,在 Windows 上按 ctrl-Z。

您可以捕获EOFError异常并中断while循环以优雅地结束程序,因此将异常块更改为:

except EOFError:
    print('Done.')
    break
于 2018-06-29T15:32:22.690 回答
2

您捕获了异常,这意味着 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看起来都像是从文件末尾读取的尝试。

于 2018-06-29T15:29:23.793 回答
0

如果您要引发以下代码将在 Python 中产生 SyntaxError, EOF:

print("EOF 现在在哪里?")

这是一个测试,看看 EOF 发生在哪里......怀疑它将是 EOF 第 4 行

print("世界你好!"

不过,我不确定这是否是您所说的“引发错误”。在 StackOverflow 中创建一个新帖子

于 2018-12-03T18:55:06.487 回答