gpt4 book ai didi

python - 捕获所有异常的缺点(在最高程序级别,然后重新引发,只是在退出之前记录?)

转载 作者:太空狗 更新时间:2023-10-30 00:37:27 24 4
gpt4 key购买 nike

我在远程机器上有一个长时间运行的程序,我想确保 (1) 我有导致它终止的任何异常的记录,以及 (2) 如果它终止,有人会收到通知。有没有人看到我使用的方法的缺点? (或者有更好的建议?)

我在这里阅读了 Python 文档和许多与异常相关的帖子,并且明白笼统的 except 子句通常不是一个好主意。在子程序和模块中,我总是使用 except 来处理特定的预期异常,但在程序的最高级别有一个“包罗万象”的 except 子句似乎很有用,以确保我可以在程序退出之前记录异常。

你怎么看?

import traceback
try:
# main program code here
except BaseException:
tb = traceback.format_exc()
msg = "Exiting program due to exception:" + tb
LogToFile(msg) # custom logging function
SendAlertEmail(msg) # warn admin that program terminated
raise # program exits with the existing exception

请注意,我使用的是 BaseException 而不是 Exception,因为如果有人在终端按下 Ctrl-C,我将其记录为退出程序的原因(并提醒管理员程序已退出)。但我想我也可以使用:

except Exception, KeyboardInterrupt:

最佳答案

没有特别的缺点,但是一个很好的选择 -- sys.excepthook .

在你的特定版本中,考虑使用裸except:,和sys.exc_info()来获取异常信息;这将确保您确实捕获所有内容——即使在某些模块引发某些else而不是BaseException 子类的实例的奇怪情况下也是如此。例如:

>>> class X: pass
...
>>> raise X
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.X: <__main__.X instance at 0xc9ad0>

如您所见, 仍然可以引发一些 except BaseException: 不会捕获的东西——这就是为什么 bare-except except: 仍然存在(专门用于非常特殊的用途,例如您的用途!)。

无论您是使用钩子(Hook)还是自己构建,请考虑(可能取决于配置标志或环境设置)不要让最终用户承担所有细节的负担(就像改进后的整洁触摸一样)用户体验!),只是一个有意义的总结(让用户放心,问题的所有细节都已被记录,等等)。

关于python - 捕获所有异常的缺点(在最高程序级别,然后重新引发,只是在退出之前记录?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com