未处理异常的错误回溯消息在哪里写入 - sys.stdout 或 sys.stderr 或其他地方? (在Python)
Where is the error traceback message for unhandled exceptions written - sys.stdout or sys.stderr or somewhere else? (in Python)
据我了解,在Python、sys.stdin
、sys.stdout
和sys.stderr
中分别是链接到标准输入、输出和错误流的文件对象。现在 stdout
和 stderr
文件对象可以更改为任意文件,以便将它们记录在控制台以外的其他地方。
我这样做了,一切正常。但是,我注意到如果出现未处理的异常,则会抛出一条错误回溯消息,并显示在控制台中。这表示此回溯消息未定向到 stdout
或 stderr
.
请在下面找到 运行:
的代码
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 中的错误没有打印出来。那么这个错误信息实际指向哪里呢?
您已将您程序的标准错误重定向到其他地方,但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
据我了解,在Python、sys.stdin
、sys.stdout
和sys.stderr
中分别是链接到标准输入、输出和错误流的文件对象。现在 stdout
和 stderr
文件对象可以更改为任意文件,以便将它们记录在控制台以外的其他地方。
我这样做了,一切正常。但是,我注意到如果出现未处理的异常,则会抛出一条错误回溯消息,并显示在控制台中。这表示此回溯消息未定向到 stdout
或 stderr
.
请在下面找到 运行:
的代码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 中的错误没有打印出来。那么这个错误信息实际指向哪里呢?
您已将您程序的标准错误重定向到其他地方,但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