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

2023-12-02

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

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

我期望看到的是一系列消息,说明前 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 循环(因为如果我在循环之前打印一些内容,它就会在异常之前打印)。任何人都可以提供任何见解吗?


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

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

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

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

sys.stderr.write("Valid letter, '{}' found. Keep going.\n".format(letter))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 在 print() 输出之前将异常打印到控制台 的相关文章

随机推荐

  • 搜索按钮上的进度条

    我有这个 C 代码来显示进度条 public partial class FormPesquisaFotos Form public FormPesquisaFotos InitializeComponent private void Fo
  • switch 语句的逻辑部分或 case 部分如何?

    如果您有一个 switch 语句并希望在值为一个值时运行某些代码or另一个你怎么做 以下代码始终进入默认情况 include
  • Java Paths.get .... readAllBytes(path)) 不适用于相对路径

    我是 Java 新手 正在尝试构建 FX 应用程序 我的功能之一旨在用其他字符串替换某些字符串 只要我定义目标文件的绝对路径 该脚本就可以正常工作 但当我使用相对路径时 该脚本就会中断 问题出在 readAllBytes 方法中 该方法仅适
  • JPA - 可以在不提供可选参数的情况下调用存储过程吗?

    我正在调用带有许多可选参数的第三方存储过程 它位于 MS SQL Server 2008 R2 中 如下所示 procedure dbo pTest ReportDate varbinary max out Optional1 varcha
  • “?”附近的语法不正确: Nhibernate 生成的查询

    我在 Nhbernate 中使用位置参数时遇到问题 Criteria GroupProperty 正在发出带有命名变量和位置变量的 SQL 这个说法 session CreateCriteria typeof MatchStageFrom
  • 如何将 Matlab 函数的输出分配给单行中的变量?

    matlab中有没有一种方法可以将matlab中函数的输出分配给单行内的向量 例如 此函数应分配周长和面积值 function p a square geom side p perimeter square side a side 2 p
  • 分两列打印

    我们应该形成一个出现 108 次的名称数组 我们应该在左列中包含名称 1 54 在右列中包含名称 55 108 当一页有 108 个名称后 我们初始化数组并重新开始 我的代码的输出显示打印的名称 1 54 并且名称 55 108 不是位于同
  • Angular 2-ngModel 中的更改未反映在下拉列表中

    所以我有一个非常简单的场景 其中在下拉列表更改时显示确认弹出窗口 如果用户选择取消 我需要将下拉值恢复为旧值 我认为我做得正确 甚至在 DOM 中 ngModel 的值与select正在反映 但不知何故 它并没有恢复显示中的选定值 这是我的
  • 以编程方式获取框架 ID

    有人知道是否有办法以编程方式获取当前框架 ID 是的 您可以在 Play 类上获取该属性 Play id
  • 离散小波变换 Matlab

    我正在尝试使用 Matlab 小波工具箱中提供的函数来创建图像的多级离散小波分解 提取系数 操作它们 并将它们重新组合回图像中 我尝试使用许多函数 但它们似乎都不能满足我的需要 以下是执行此操作的步骤 使用wavedec2将图像分解为 C
  • 在 C# 中,这段带有“get”的代码是什么意思?

    我是 C 新手 private string m public string M get return m C 中的这种 getter setter 是否像 Java 一样 这部分是一个字段 private string m 这部分是一个只
  • 将数组/对象树的键转换为小写

    我目前正在优化一个 PHP 应用程序 发现一个函数被调用了大约 10 20k 次 所以我想我应该从那里开始优化 function keysToLower obj if is object obj is array obj return ob
  • 从列表中随机选择

    我在 Excel 工作表 A1 B115 中有一个项目列表 目前我可以输入 10 个变量 从列表中检索正确的数据 现在代码 C1 1 运行A1 A115并检查值是否在1000 2000之间 如果是这样 请将 B 值复制到某处 C2 1 运行
  • 如何在 WooCommerce 中对自定义购物车费用进行征税

    准确地找到了我正在寻找的代码片段 无论价格如何 都可以为每个单独的购物车项目添加固定费用金额 这个网站是卖轮胎的 所以每个轮胎都会充电3 这是我正在使用且有效的代码 add action woocommerce cart calculate
  • 无法维护java多线程中生产者任务的顺序

    我正在编写一个多线程应用程序 其中有 n 个生产者尝试将元素添加到共享资源 我想维护生产者在共享资源中生成元素的顺序 例如 我的共享资源是 SynchronizedQueue P1 P2 P3 P4 将按照 p1 p2 p3 p4 的顺序生
  • 修复“xml 外部实体引用不正确的限制”的最佳方法是什么?

    我们最近运行 VeraCode 指出了以下方法 public XmlElement RunProcedureXmlElement string Procedure List
  • 使用线程池/线程来读取大型文本文件?

    关于我之前的一个问题 我发布了 我必须读取几个非常大的 txt 文件 并且必须根据用户输入使用多个线程或单个线程来执行此操作 假设我有一个获取用户输入的 main 方法 并且用户请求一个线程并希望为该线程处理 20 个 txt 文件 我将如
  • GAE Webapp2 - 销毁会话不起作用

    或者我误解了如何破坏工作 这是一个示例代码 class TestHandler BaseHandler def get self counter self session get counter if not counter counter
  • 如何使用 Observable.FromEvent 而不是 FromEventPattern 并避免字符串文字事件名称

    我正在学习 WinForms 中的 Rx 方法 并有以下代码 Create an observable from key presses grouped by the key pressed var groupedKeyPresses Ob
  • 为什么 Python 在 print() 输出之前将异常打印到控制台

    我正在编写一个相当冗长的函数 它读取 CSV 文件并循环遍历行并检查它们是否具有预期的格式 如果发现不符合预期的格式 则会引发异常 对于具有预期格式的每一行 它都会向控制台打印一条消息 使用 print 函数 说明该行有效 否则会引发错误