【问题标题】:How can I raise an EOF error?如何引发 EOF 错误?
【发布时间】:2018-06-29 15:25:59
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: python exception-handling eoferror


    【解决方案1】:

    来自input's documentation

    EOF被读取时,EOFError被提升。

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

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

    except EOFError:
        print('Done.')
        break
    

    【讨论】:

    • 你能告诉我一个如何捕捉 EOFError 的例子吗?输入应该是什么?
    • except EOFError 块捕获 EOFError。如果你想测试它,只需在 *NIX 上按 ctrl-D,在 Windows 上按 ctrl-Z,然后输入。
    • 嗯...我使用 mac 和 command-D 或 Z 无法正常工作。
    • 命令-D 的结果:以年为单位输入您的年龄:这是一个无效的年龄规范。输入您的年龄:
    • 命令-Z 的结果:输入您的年龄:这是一个无效的年龄规范。
    【解决方案2】:

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

    【讨论】:

    • 对不起,当我输入 $ python -c 'input()'
    • 我在 Python 2 和 Python 3 中都得到了EOFError;不知道你是怎么得到ValueError的。
    • 你有没有复制粘贴代码并输入为 $ python -c 'input()' /null?
    • 另外,如果我在空白编辑器中运行 $ python -c 'input()' , line 1,位置 1
    • 该命令(减去$)旨在从外壳程序运行,而不是从解释器内部运行。 $ 只是表示 shell 提示符的约定。
    【解决方案3】:

    如果您想提高 以下代码将在 Python 中产生 SyntaxError, EOF:

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

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

    print("你好世界!"

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多