运行完全相同的简单代码,带有一个简单的(故意)错误,有时会在打印输出之前产生回溯,有时会在打印输出之后产生回溯

问题描述 投票:0回答:1

有问题的代码:

print('s')
y=1/0

我完全理解错误(它只是除以零),导致运行时(在 PyCharm 上,通过按 Shift+F10,正常方式)以下输出:

C:\Users\myname\PycharmProjects\test1\.venv\Scripts\python.exe C:\Users\myname\PycharmProjects\test1\Functions\error.py 
Traceback (most recent call last):
  File "C:\Users\myname\PycharmProjects\test1\Functions\error.py", line 2, in <module>
    y=1/0
      ~^~
ZeroDivisionError: division by zero
s

Process finished with exit code 1

或者这个(现在请注意,打印的 's' 出现在回溯之前而不是之后:

C:\Users\myname\PycharmProjects\test1\.venv\Scripts\python.exe C:\Users\myname\PycharmProjects\test1\Functions\error.py 
s
Traceback (most recent call last):
  File "C:\Users\myname\PycharmProjects\test1\Functions\error.py", line 2, in <module>
    y=1/0
      ~^~
ZeroDivisionError: division by zero

Process finished with exit code 1

这是一个错误。我在具有更多语句的程序中遇到过这个问题,有时回溯隐藏在它们之前。

我尝试搜索类似的问题,但他们并不关注如果存在回溯,输出显示的顺序是否重要,并且没有如此简单的错误,而且它们更旧。

python pycharm traceback
1个回答
0
投票

一些粗略的研究让我相信这确实是 PyCharm 中的一个错误(并且似乎在 JetBrains 的其他 IDE 中普遍存在),与

stdout
stderr
的打印方式有关。

GitHub 用户

@wolph
python-progressbar
项目
的所有者,比我更雄辩地说:

PyCharm 中的错误在于 stderr 和 stdout 之间的计时,它看起来完全随机,导致结果交错。

在过去的 12 年中,

JetBrains 面向公众的错误跟踪器已经对这种错误行为进行了多次报告。其中一些(看似)相关的内容仍标记为“开放”:

    调试器:stdout/stderr 同步
  • OCUnit:同步标准错误/标准输出
  • 即便如此,JetBrains 员工 Sergey Simonchik
在 2019 年提供了一个潜在的解决方法

请注意,默认情况下仍不能保证
stdout

stderr
之间的正确排序,但有一种方法可以使用
run.processes.with.redirectedErrorStream
注册表项强制执行。要启用它,请执行以下操作:

主菜单上的“帮助|查找操作...”;找到“注册表...”项并打开它;
  • 启用
  • run.processes.with.redirectedErrorStream
  • 键。
    
    
  • 启用它将合并 IDE 生成的进程的 stdout 和 stderr 流。这将确保来自 stdout/stderr 的消息正确排序。

[...]

但是,作为代价,合并 stdout 和 stderr 将使它们难以区分:错误输出将打印为普通文本。使用 ANSI 颜色以不同方式突出显示错误输出。 请注意,该注册表项仅支持请求的运行/调试配置。如果您的运行/调试配置不支持它,请在问题跟踪器中提交请求。

考虑到该错误在超过 12 年的报告后仍然普遍存在,看来这并不是 JetBrains 需要优先解决的问题。如果此功能对于您在项目中正确使用很重要(并且无论出于何种原因,上述解决方法在您的情况下不起作用),我个人建议评估另一个 IDE。有很多可供选择。

© www.soinside.com 2019 - 2024. All rights reserved.