2012-03-07 40 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