首页 > 解决方案 > 未处理异常的错误回溯消息在哪里写入 - sys.stdout 或 sys.stderr 或其他地方?(在 Python 中)

问题描述

据我了解,在 Python 中sys.stdinsys.stdoutsys.stderr是分别链接到标准输入、输出和错误流的文件对象。现在可以将stdoutandstderr文件对象更改为任意文件,以便将它们记录在控制台以外的其他地方。

我这样做了,一切正常。但是,我注意到如果出现未处理的异常,则会引发错误回溯消息,该消息正在控制台中显示。这表明此回溯消息未定向到stdoutstderr

请在下面找到运行的代码:

import sys

old_stdout, old_stderr = sys.stdout, sys.stderr
sys.stdout, sys.stderr = open('Outfile.txt', 'w'), open('Errorlog.txt', 'w')

try:
    name = input('Enter your name: ')
    print('Hi %s' % name)
    age = int(input('What is your age? '))
    if age <= 0:
        raise ValueError('Age cannot be 0.')
    else:
        print('So how does it feel to be %d' % age)
# except Exception as e:
#     print(e)
finally:
    sys.stderr.close(), sys.stdout.close()
    sys.stderr, sys.stdout = old_stderr, old_stdout

当存在 except 块时,错误消息将按照标准输出中的预期打印(即,Outfile.txt)。当该except块被注释掉以使其成为未处理的异常时,将在控制台中打印回溯,如下所示:

F:\> python.exe Change_stdout_stderr_to_log_files.py
Anirban
0
Traceback (most recent call last):
  File "Change_stdout_stderr_to_log_files.py", line 18, in <module>
    raise ValueError('Age cannot be 0.')
ValueError: Age cannot be 0.

F:\> 

虽然没有打印关于 stdout 或 stderr 中的错误。那么这个错误消息实际上是指向哪里的呢?

标签: pythonstdoutstderrunhandled-exceptiontraceback

解决方案


您已将程序的标准错误重定向到其他地方,但Python 的标准错误仍然连接到您的终端。

观察:

bash$ python -c 'import sys; sys.stderr = open("/dev/null"); raise ValueError("I am the walrus")'
bash$ python -c '=' 2>/dev/null
bash$ python -c 'import sys; sys.stderr = open("/dev/null"); raise ValueError("I am the walrus"); ='
  File "<string>", line 1
    import sys; sys.stderr = open("/dev/null"); raise ValueError("I am the walrus"); =
                                                                                     ^
SyntaxError: invalid syntax

推荐阅读