我有一个在 Windows 中运行的非常大的 Python 3.x 程序。它在 99.9% 的情况下都运行良好,但偶尔会崩溃。我不确定是什么导致了崩溃,可能有很多原因。由于出于安全原因,我必须使用不可见的控制台运行“编译”的 .exe 程序(不要问),因此当它死机时,我看不到任何形式的控制台读数。所以显然,如果我可以让它将崩溃回溯输出为文本文件,那就太好了。
我熟悉 Python 中的 try/except,但导致问题的代码段可能在任何地方,我不想在数千行代码的每一行周围编写单独的 try/except。有没有办法让程序始终将任何程序停止错误输出为文本文件,无论哪一行代码导致问题,或者错误可能是什么?
在您的代码中的某处,您必须有一个进入可能崩溃的代码的入口点(至少在主脚本中)。您可以将其包装在try/except对中,然后使用traceback模块中的函数在发生异常时将异常打印到文件中:
改变:
if __name__ == "__main__":
do_stuff()
Run Code Online (Sandbox Code Playgroud)
到:
import traceback
if __name__ == "__main__":
try:
do_stuff()
except:
with open("exceptions.log", "a") as logfile:
traceback.print_exc(file=logfile)
raise
Run Code Online (Sandbox Code Playgroud)
如果你愿意,你可以添加一些额外的代码来将额外的输出写入文件,带有时间/日期戳或你认为可能有用的任何其他信息。如果您想对代码的某些部分进行特别审查,您可能需要添加额外的try/except块,或多或少类似于上面的块。例如,您可以将一个块放入循环中,如果发生异常,您可以在其中打印出循环值:
for x in some_iterable:
try:
do_something_with(x)
except:
with open("exceptions.log", "a") as logfile:
print("Got an exception while handling {!r} in the loop:".format(x)
traceback.print_exc(file=logfile)
raise # you could omit this line to suppress the exception and keep going in the loop
Run Code Online (Sandbox Code Playgroud)
logging如果您想要一个更可配置的系统来解决问题的文件写入问题,您也可以使用该模块。该logging.debug和logging.exception功能都读取由所使用的相同的异常信息traceback模块,而是用自己格式化的东西更多的选择(如果你想要的)。请注意,设置日志记录比手动打开文件要复杂一些。
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |