用Python编写的服务器的强大无限循环

gue*_*tli 15 python exception-handling robustness infinite-loop server

我在处理事件期间编写了一个处理事件和未捕获异常的服务器,不得终止服务器.

服务器是一个单线程的非线程python.

我想终止这些错误类型:

  • 一个KeyboardInterrupt
  • 的MemoryError
  • ...

内置异常列表很长:https://docs.python.org/2/library/exceptions.html

我不想重新发明这个异常处理,因为我猜它以前做了好几次.

如何进行?

  1. 有一个白名单:一个正常的例外列表,处理下一个事件是正确的选择
  2. 有一个黑名单:一个例外列表,表明终止服务器是正确的选择.

提示:这个问题不是关于在后台运行unix守护进程.它不是关于双叉而不是关于重定向stdin/stdout :-)

Eth*_*man 2

最上面的例外是BaseException. 下面有两个组:

  • Exception衍生的
  • 其他一切

诸如Stopiteration、、等都是 的ValueError例子。TypeErrorException

之类的东西GeneratorExitSystemExit都不KeyboardInterrupt是后裔Execption

所以第一步是捕获Exception而不是捕获,BaseException这样您就可以轻松终止程序。我还建议捕获,GeneratorExit因为 1)它实际上永远不会被看到,除非它是手动引发的;2)你可以记录它并重新启动循环;3)它旨在表明生成器已退出并且可以清理,而不是程序应该退出。

下一步是用足够的详细信息记录每个异常,以便您可以找出问题所在(当您稍后进行调试时)。

最后,您必须自己决定Exception要终止哪个派生异常(如果有):我建议RuntimeErrorMemoryError,尽管您可以通过简单地停止并重新启动服务器循环来解决这些问题。

所以,真的,这取决于你。

如果存在其他IOError严重到足以退出的错误(例如在尝试加载配置文件时),则负责加载配置文件的代码应该足够聪明,能够捕获该错误IOError并引发错误SystemExit

至于白名单/黑名单——使用黑名单,因为应该只有少数(如果有的话)Exception基于例外情况,您需要实际终止服务器。