2010-11-15 26 views
9

我對Python中用戶定義的異常以及如何在一個完整的項目中組織它們有一些疑問。Python:在一個完整的項目中組織用戶定義的異常

我有具有以下結構(__init__.py略)一些子包一個相當複雜的Python項目:

/docs (Documentation) 
/apidocs (generated API documentation) 
/askindex (my application package) 
    /test (Unit tests directory) 
     test_utils.py 
     ... (more tests) 
    /workers (various worker classes) 
     communicators.py 
     processes.py 
     threads.py 
     utils.py 
    main.py (contains the starting point) 
    data_objects.py (various objects used all around the application) 
    settings.py (settings of the application) 
README.txt 

我想實現我自己的異常中的模塊來使用它們「工人包裹的具體錯誤。

我應該在哪裏放置這些例外?我知道我應該有我自己的基本異常,該異常將標準的Exception類繼承爲子類,併爲其他異常繼承它的子類。我應該在「工作人員」下創建一個新的「例外」模塊嗎?將異常類放入它們所在的模塊中?在這種情況下,我應該在哪裏放置我的基類?我的應用程序結構是否被佔用?

我是新來的Python例外,所以請原諒我,如果答案是顯而易見的......

回答

5

總的來說,我發現我自己的工作,當我想例外的自定義類型,它的具體到特定的模塊或包。如果它與一個模塊相關,我就把它放在那個模塊中。我還沒有找到一個情況,那就是有一個專門用於例外的模塊或者包。

實例:如果我有一個jester模塊,具有類Juggler在其與方法juggle因此可能引發DroppedBall(線索投擲爛番茄或類似的),則DroppedBall將是jester模塊中。然後crowd.Person實例可能try看着玩雜耍的人和except jester.DroppedBall

如果我有一包food,裏面有各種模塊,fruitvegetable等,它們都具有一個eat方法(從food.Foodstuff,無疑繼承),他們也許能夠提出一個RottenException,這自然屬於在food包的根目錄下:__init__.py

+0

感謝您快速回答。我沒有想到__init__.py模塊。除了包docstring和meta,我從來沒有真正知道要在裏面放什麼。遵循你的例子,異常是否會被引用爲food.RottenException? – 2010-11-15 06:21:53

+1

@馬克:是的。大模塊的一個常見模式是將它們拆分成單獨的模塊,並且讓包'__init __。py'包含相對導入以再次將模塊連接在一起(通常來自xyz import *',其中xyz定義了'__all__')。在這種情況下,這可能不適用,真的。儘管你可能想'導入通信器,進程,線程,utils',就像'os'導入'path'一樣,這樣'import os'就意味着'import os.path'。 – 2010-11-15 06:30:10

+0

@Marc:繼「食物」這個例子之後,「Foodstuff」類將在'__init __。py'中定義,'food.fruit'將'import food',然後具有'class番茄(food.Foodstuff )'。只要你小心,不要使用'從食品進口食品',循環引用是好的(見[這篇關於effbot的文章](http://effbot.org/zone/import-confusion.htm#circular -imports))。 – 2010-11-15 06:33:33