Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python会在print()输出之前将异常打印到控制台_Python_Exception - Fatal编程技术网

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

为什么Python会在print()输出之前将异常打印到控制台,python,exception,Python,Exception,我正在编写一个相当长的函数,它读取CSV文件,循环遍历行,检查它们是否符合预期的格式,如果发现不符合预期的格式,就会引发异常 对于预期格式的每一行,它都会向控制台打印一条消息(使用打印功能),说明该行有效。否则将引发错误 我希望看到的是一系列消息,表明前X行是有效的,如果遇到错误,后面会出现异常,但它会打印异常,然后打印消息,尽管这些消息是从循环的前一次迭代中调用的 有人能解释为什么会这样吗,因为我不能把我的头绕在它周围 以我创建的这个简短的基本示例为例: letters = ['a','b',

我正在编写一个相当长的函数,它读取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.
>>> 
>>>>。。。回溯(最近一次呼叫最后一次):
文件“”,第5行,在
异常:找到无效的字母“b”。中断程序。
找到有效字母“a”。继续前进。
>>> 

我想要的是首先打印代码中显示的消息,然后在代码停止时在最后打印异常,否则它会在大量打印的消息中丢失。这似乎只是针对循环(如果我在循环之前打印某些内容,那么它会在异常之前打印)。有人能提供任何见解吗?

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

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

print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)
另一种选择是为消息写入标准错误,如果您计划将输出重定向到文件,而不考虑消息,这不是一个坏主意

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

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

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

print ("Valid letter, '" + letter + "' found. Keep going.",flush=True)
另一种选择是为消息写入标准错误,如果您计划将输出重定向到文件,而不考虑消息,这不是一个坏主意

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

在空闲或终端运行代码时,我没有这个问题。在空闲或终端运行代码时,我没有这个问题。谢谢。使用同花顺参数为我解决了这个问题。谢谢。使用flush参数为我解决了这个问题。