Python守护程序-程序结构和异常控制



我已经用Python做了一段时间的业余编码,感觉很舒服。不过最近我一直在写我的第一个Daemon,并试图接受我的程序应该如何运行。

对于我过去的程序,可以通过简单地中止程序来处理异常,也许是在一些小的清理之后。我对程序结构的唯一考虑是对非异常输入的有效处理。实际上,"垃圾进来,什么都没有"。

在我的守护程序中,有一个有效地永不结束的外部循环,其中有一个睡眠语句来控制事情发生的间隔。处理有效的输入数据很容易,但我很难理解处理异常的最佳实践。有时,异常可能发生在嵌套函数的几个级别中,每个级别都需要向其父级返回一些东西,而父级又必须向父级返回一些内容,直到控制返回到最外层的循环。每个函数都必须能够处理任何异常情况,不仅对其自身,而且对其所有下属都是如此。

我为我的问题含糊不清而道歉,但我想知道是否有人能为我提供一些关于如何处理这些例外情况的一般性建议。我是否应该考虑可以在不影响父进程的情况下终止的生成子进程?一种(遥远的)可能性是,我做的事情是正确的,实际上确实需要所有的嵌套处理。另一种非常真实的可能性是,我不知道自己在说什么

Steve

异常的设计目的是(可能)不会立即被捕获——这就是它们与函数返回表示"错误"的值的区别。每个异常都可以在你想(也可以)做点什么的级别被捕获

至少,您可以在主循环中捕获所有异常并记录一条消息。这很简单,可以确保守护进程不会死亡。在主循环中,修复大多数问题可能为时已晚,因此您可以更快地发现特定的异常。例如,如果文件格式错误,请在打开并尝试使用该文件的例程中捕获异常,而不是在发现问题的解析代码中捕获异常;也许你可以尝试另一种格式。基本上,如果有一个地方可以从特定的错误条件中恢复,那么就在那里捕获它并进行恢复

答案将是"取决于"。

如果某个低级函数中发生异常,如果该级别有足够的信息可供使用,即使发生异常,也可以让函数成功完成,那么在那里捕获它可能是合适的。例如,当从.stl文件中读取三角形时,三角形的法向量由组成三角形的三个点的序列显式给出和隐式给出。因此,如果法向量被给定为(0,0,0),这是一个0长度的向量,并且应该在法向量类的构造函数中触发异常,那么它可以安全地在Triangle类的构造函数内捕获,因为它仍然可以通过其他方式计算。

如果没有足够的信息来处理异常,那么它应该逐渐上升到可以处理的级别。例如,如果您正在编写一个模块来读取和解释文件格式,那么如果给定的文件与文件格式不匹配,它应该引发异常。在这种情况下,可能是使用该模块的程序的顶层应该处理异常并与用户通信。(或者,如果是守护进程,则记录错误并继续。)

最新更新