如何引发 EOF 错误?

How can I raise an EOF error?

我是学习新手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. 我不明白're-raise this exception'是什么意思

  2. 书上说,'the call to input will raise an EOFError if the console input fails.'同样,我不知道什么是控制台输入,也不知道什么时候控制台输入失败。

我尝试了几种引发 EOFError 的方法,但每次我尝试时都只有 ValueError。有人可以给我一些想法吗?

提前致谢。

您捕获了异常,这意味着 Python 将继续循环,而不是让异常向上渗透堆栈,如果它仍未被捕获,则最终结束程序。在 except 子句中不带参数调用 raise 只会再次引发相同的异常,等同于

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 读取的尝试看起来都像是从文件末尾读取的尝试。

来自input's documentation

When EOF is read, EOFError is raised.

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

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

except EOFError:
    print('Done.')
    break

如果你想筹集资金 下面的代码会产生一个 SyntaxError, EOF in Python:

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

这是一个查看 EOF 发生位置的测试......怀疑它将是 EOF 第 4 行

print("世界,您好!"

不过,我不确定这是否是您所说的“引发错误”的意思。 在 Whosebug 中创建一个新的 post