Python: Organization of user-defined exceptions in a complete project
我有一些关于Python中用户定义的异常的问题,以及它们应该如何组织在一个完整的项目中。
我有一个相当复杂的python项目,其中有些子包具有以下结构(__init__.py省略):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| /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 |
我希望实现自己的异常,以便在"Workers"包的模块中针对特定错误使用它们。
我应该把这些例外放在哪里?我知道我应该有自己的基异常,它子类化标准异常类,并为其他异常子类化它。我应该在"workers"下创建一个新的"exceptions"模块吗?将异常类放入引发它们的模块中?在这种情况下,我应该把我的基类放在哪里?我的申请结构是否适当?
我对Python中的异常不熟悉,所以如果答案很明显,请原谅我…
一般来说,我在自己的工作中发现,当我想要一个自定义的异常类型时,它是特定于特定模块或包的。如果它与一个模块相关,我就把它放在那个模块中。我还没有找到一个这样的情况,即有一个专门用于例外情况的模块或包会更整洁。
示例:如果我有一个jester模块,其中包含一个类Juggler,方法是juggle,它可以提高DroppedBall(提示扔烂番茄或类似的东西),那么DroppedBall将在jester模块中。然后,crowd.Person实例可以让try监视变戏法者和except jester.DroppedBall。
如果我有一个包food,里面有各种模块,fruit、vegetable等,它们都有eat的方法(毫无疑问是从food.Foodstuff继承的),它们可能会产生一个RottenException,它自然属于food包的根:__init__.py。
- 谢谢你的快速回答。我没想到init.py模块。除了包docstring和meta,我真的不知道在里面放什么。按照您的例子,这个异常会被引用为food.rottenception吗?
- @ Marc:是的。大模块的一个常见模式是将它们分割成单独的模块,并让包__init__.py包含相对导入,以便再次将模块连接在一起(通常是from xyz import *,其中xyz定义__all__)。在这种情况下,这可能不适用,真的。你可能想要import communicators, processes, threads, utils,虽然,就像os进口path,所以import os意味着import os.path。
- @Marc:在food例之后,Foodstuff类将在__init__.py中定义,food.fruit将import food和class Tomato(food.Foodstuff)定义。只要你小心,不使用from food import Foodstuff,循环引用就可以了(参见本文关于effbot)。
- 谢谢你的解释。还有一个问题:为什么标准库将所有异常都放在异常包中?这是因为它们中有许多,并且它们可以出现在几个不同的包中吗?
- 我希望如此,因为它们在整个地方都被利用了。我刚刚发现的另一个例子,zope接口的东西,有很多例外,zope.interface.exceptions也有例外。在这种情况下,它或多或少与我提到的将一个大模块拆分成一个包的情况相同,我认为,并保留in it.py只是为了将它捆绑在一起。如果你有一些例外,他们不仅仅是class MyException(Exception): pass型的,这可能是个好主意。
- 我将看看几个著名的项目,看看他们是怎么做的,谢谢你的提示。我验证你的答案。
- 这是我迄今为止对一个答案最满意的接受——更多地讨论这样一个问题是件好事,它也让我思考如何在我的一两个项目中做到这一点。谢谢:
- 我很高兴你满意。我总是对这个社区感到惊讶。总会有人来讨论你的问题,给你一些好主意。