2012-03-07 67 views
2

我一直在Python中做业余编码一段时间,感觉很舒服。最近虽然我一直在写我的第一个守护进程,并且试图接受我的程序应该如何流动。Python守护进程 - 程序结构和异常控制

在我过去的程序中,异常可以通过简单地中止程序来处理,也许经过一些小的清理。我必须考虑的方案结构是有效处理非例外投入。实际上,“垃圾进入,没有出去”。

在我的守护进程中,有一个外部循环实际上永远不会结束,并且内部有一个sleep语句来控制事件发生的时间间隔。处理有效的输入数据很简单,但我正在努力理解处理异常的最佳做法。有时候,异常可能发生在嵌套函数的几个级别中,并且每个都需要将某些东西返回给它的父类,而父类必须将某些东西返回给它的父类,直到控制返回到最外层循环。每个功能必须能够处理任何异常情况,不仅适用于本身,也适用于所有下属。

我很抱歉我的问题含糊不清,但我想知道是否有人可以为我提供一些关于如何处理这些异常的一般指示。我是否应该查看可以在不影响父母的情况下终止的产卵子流程? (远程)可能性是我正确地做事,实际上确实需要所有的嵌套处理。另一个非常现实的可能性是,我没有理解我在说什么。 :)

史蒂夫

回答

0

答案将是“它取决于”。

如果在某个低级函数中发生异常,如果在该级别有足够的信息可以让该函数成功完成(尽管有例外),那么可能需要在该位置捕获该异常。例如。当从.stl文件中读取三角形时,它将显示三角形的法向矢量,并通过组成三角形的三个点的序列隐式给出。因此,如果法向量为(0,0,0),它是一个0长度的向量,并且应该在Normal向量类的构造函数中触发异常,这可以安全地在Triangle类的构造函数中捕获,因为它仍然可以通过其他方式计算。

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

3

异常是为了(可能)不被立即捕获而设计的 - 这就是它们与函数返回值的方式不同的方式,这意味着“错误”。每个异常都可以在您想要(并且可以)对此做些什么的级别上捕获。

至少,您可以首先捕获主循环中的所有异常并记录消息。这很简单,并确保你的守护进程不会死亡。在主循环中,解决大多数问题可能为时已晚,因此您可以尽早地捕获特定异常。例如。如果文件的格式不正确,请在打开的例程中捕获异常,并尝试使用该文件,而不是深入发现问题的解析代码;也许你可以尝试另一种格式。基本上如果有一个地方你可以从一个特定的错误状况中恢复过来,赶上它并且这样做。

+0

谢谢,我未能掌握的部分是以我想要的水平捕捉异常。我不明白,我可以提出一个例外,并在更高层次上进行处理。这使得生活比试图通过每个功能级别返回到最外层循环要容易得多。 – Steve 2012-03-10 14:48:47

+0

很高兴我能帮到你。由于您是新手,因此请您“接受”我的答案,如果您发现它回答您的问题。 – alexis 2012-03-10 14:53:26