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

标签 python exception

我在远程机器上有一个长时间运行的程序,我想确保 (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/

相关文章:

java - URL - Android 中图像文件的 FileNotFoundException

在 JPanel 中实现 Runnable 时出现 java.lang.StackOverflowError - Java Swing

python - 只是分心 : tokenizing English without whitespaces. Murakami SheepMan

Python Bokeh - 混合

python - AttributeError: 'tuple' 对象没有属性 'shape'

c++ - 来自标准库调用的结构化异常 (SE)

java - 为什么通过 catch block 进行逻辑和路由是一个坏主意?

python - Django 模型覆盖仅在我保存两次时才有效

python - scipy odeint 中的当前迭代

c - 在 Linux 中接收 SIGINT 和异常句柄