我已经在Python中做了一段时间的业余编码并且觉得很舒服。最近虽然我一直在写我的第一个守护进程,但我正试图接受我的程序应该如何流动。
使用我过去的程序,可以通过简单地中止程序来处理异常,也许是在一些小的清理之后。我必须给予程序结构的唯一考虑因素是有效处理非例外输入。实际上,“Garbage In,Nothing Out”。
在我的守护进程中,有一个外部循环实际上永远不会结束,并且在其中有一个睡眠声明来控制事件发生的间隔。处理有效的输入数据很容易,但我很难理解处理异常的最佳实践。有时异常可能发生在嵌套函数的几个级别中,并且每个异常都需要向其父级返回一些内容,而父级必须依次向其父级返回一些内容,直到控制返回到最外层循环。每个函数必须能够处理任何异常条件,不仅适用于自身,也适用于其所有下属。
我为我的问题的模糊性道歉,但我想知道是否有人可以向我提供一些关于如何处理这些例外的一般指示。我是否应该关注可以在不影响父级的情况下终止的产生子流程? (远程)可能性是我正确地做事并且实际上确实需要所有嵌套处理。另一个非常现实的可能性是,我不知道我在说什么。 :)
史蒂夫
答案 0 :(得分:3)
异常是为了(可能)不被立即捕获而设计的 - 它们与函数返回意味着“错误”的值的区别。每个异常都可以在您希望(并且可以)对其执行某些操作的级别进行捕获。
至少,您可以从捕获主循环中的所有异常并记录消息开始。这很简单,可确保您的守护程序不会死亡。在主循环中,修复大多数问题可能为时已晚,因此您可以更快地捕获特定的异常。例如。如果文件格式错误,请在打开的例程中捕获异常并尝试使用该文件,而不是在发现问题的解析代码中深入;也许你可以试试另一种格式。基本上,如果有一个地方你可以从特定的错误状态中恢复,那就抓住它并这样做。
答案 1 :(得分:0)
答案将是“取决于”。
如果在某个低级别函数中发生异常,如果在此级别有足够的可用信息以使该函数尽管异常成功完成,则可能适合将其捕获。例如。当从.stl
文件中读取三角形时,三角形的法线向量既明确给出,又由构成三角形的三个点的序列隐式给出。因此,如果法线向量给定为(0,0,0),这是一个0长度向量并且应该在Normal向量类的构造函数中触发异常,那么可以安全地捕获到Triangle类的构造函数中,因为它仍然可以通过其他方式计算。
如果没有足够的信息来处理异常,它应该向上涓涓处理到可以处理的水平。例如。如果您正在编写一个模块来读取和解释文件格式,如果给出的文件与文件格式不匹配,则应该引发异常。在这种情况下,它可能是使用该模块的程序的顶级应该处理异常并与用户通信。 (或者在守护进程的情况下,记录错误并继续。)