我用Python编写业余代码已经有一段时间了,感觉很舒服。不过,最近我一直在编写我的第一个守护进程,并试图与我的程序应该如何流动达成协议。
在我以前的程序中,异常可以通过简单地中止程序来处理,也许在一些小的清理之后。对于程序结构,我唯一需要考虑的就是对非异常输入的有效处理。实际上,“垃圾进了,什么都没出”。
在我的守护进程中,有一个有效的永不结束的外部循环和一个休眠语句来控制事情发生的间隔。处理有效输入数据很容易,但我很难理解处理异常的最佳实践。有时,异常可能发生在多个级别的嵌套函数中,并且每个函数都需要向其父函数返回某些内容,而父代函数又必须向其父代返回某些内容,直到控制返回到最外层的循环。每个函数必须能够处理任何异常情况,不仅对于它自己,而且对于它的所有从属函数。
我为我的问题含糊其辞而道歉,但我想知道是否有人能给我一些关于如何处理这些异常的一般性建议。我是否应该考虑生成可以终止而不会影响父进程的子进程?一种(极小的)可能性是,我做的事情是正确的,并且实际上确实需要所有的嵌套处理。另一种非常真实的可能性是,我不知道我在说什么。:)
史蒂夫
发布于 2012-03-08 08:35:30
异常的设计目的是(可能)不会立即被捕获--这就是它们与函数返回表示“错误”的值的区别所在。每个异常都可以在您想要(并且可以)对其执行某些操作的级别进行捕获。
至少,您可以从捕获主循环中的所有异常并记录一条消息开始。这很简单,并确保您的守护进程不会死。在主循环中,修复大多数问题可能为时已晚,因此您可以更快地捕获特定的异常。例如,如果文件的格式错误,则在打开并尝试使用该文件的例程中捕获异常,而不是深入发现问题的解析代码;也许您可以尝试另一种格式。基本上,如果有一个地方你可以从一个特定的错误条件中恢复,在那里捕捉它并这样做。
发布于 2012-03-08 07:05:56
答案将是“视情况而定”。
如果在某些低级函数中发生异常,并且在此级别有足够的信息可用来让函数在发生异常的情况下成功完成,则在那里捕获它可能是合适的。例如,当从.stl文件中读取三角形时,三角形的法向量由组成三角形的三个点的序列显式和隐式给出。因此,如果法向量被指定为(0,0,0),这是一个长度为0的向量,并且应该在normal vector类的构造函数中触发异常,则可以在Triangle类的构造函数中安全地捕获它,因为它仍然可以通过其他方法进行计算。
如果没有足够的信息来处理异常,它应该逐渐上升到可以处理的级别。例如,如果你正在编写一个模块来读取和解释一种文件格式,如果给它的文件与文件格式不匹配,它应该会引发一个异常。在这种情况下,处理异常并与用户通信的可能是使用该模块的程序的顶层。(或者,如果是守护进程,请记录错误并继续。)
https://stackoverflow.com/questions/9606937
复制相似问题