python - 为什么 Python 在 print() 输出之前将异常打印到控制台

标签 python exception

我正在编写一个相当冗长的函数,它读取 CSV 文件并循环遍历行并检查它们是否具有预期的格式,如果发现不符合预期的格式,则会引发异常。

对于具有预期格式的每一行,它都会向控制台打印一条消息(使用打印功能),说明该行有效。否则会引发错误。

我期望看到的是一系列消息,表明前 X 行有效,如果遇到错误,后面会出现异常,但它会打印异常,然后打印消息,尽管它们被称为来自循环的先前迭代。

谁能解释一下为什么会这样,因为我无法理解它?

以我创建的这个简短的基本示例为例:

letters = ['a','b','c']
for letter in letters:
    if letter == 'a' or letter == 'c':
        print ("Valid letter, '" + letter + "' found. Keep going.")
    else:
        raise Exception("Invalid letter, '" + letter + "' found. Break program.")

它产生以下输出:

>>> >>> ... ... ... ... ... Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
Exception: Invalid letter, 'b' found. Break program.
Valid letter, 'a' found. Keep going.
>>> 

我想要的是首先打印消息,就像它们出现在代码中一样,并在代码停止时最后打印异常,否则它会在大量打印消息中丢失。它似乎只是 for 循环(因为如果我在循环之前打印一些内容,它就会在异常之前打印)。谁能提供任何见解?

最佳答案

异常是通过标准错误流打印的,而不是标准输出。根据终端的不同,两个输出并不总是同步。

您可以在打印后刷新输出:

print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)

另一种选择是将消息写入标准错误,如果您打算将输出重定向到文件而不考虑消息,这不是一个坏主意

sys.stderr.write("Valid letter, '{}' found. Keep going.\n".format(letter))

关于python - 为什么 Python 在 print() 输出之前将异常打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59719872/

相关文章:

c++ - 如何强制中断方法的执行

python - 尝试获取 HTTP 代码。有人可以在他们的 Python 解释器中为我尝试这段代码,看看为什么它不起作用吗?

C++ 捕获构造函数异常

Python:回答终端提示

python - 将 pandas df 中的日期和时间列转换为时间戳

Java 异常 - TransactionRolledbackLocalException

mysql - 打开连接时发生内部连接 fatal error

Python 拆分数组使用 For 循环来表示每个拆分并将其重新组合在一起

python - boto dynamodb2 : Can I query a table using range key only?

python - 如何禁用flask app.run() 的默认消息?