Python:完整项目中用户定义异常的组织方法
我有一些关于Python中用户自定义异常的问题,以及在一个完整项目中应该如何组织这些异常。
我有一个相对复杂的Python项目,里面有一些子包,项目结构大致是这样的(__init__.py
省略了):
/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'包的模块中处理特定的错误。
我应该把这些异常放在哪里呢?我知道我应该有一个自己的基础异常类,它要继承标准的Exception类,然后再为我的其他异常类继承这个基础类。我应该在'workers'下创建一个新的'exceptions'模块吗?还是把异常类放在它们被触发的模块里?如果这样的话,我的基础类应该放在哪里呢?我的应用结构合适吗?
我对Python中的异常还很陌生,所以如果答案很明显,请多多包涵...
1 个回答
一般来说,我在自己的工作中发现,当我想要一个自定义的异常类型时,它通常是针对某个特定的模块或包的。如果这个异常和某个模块相关,我就会把它放在那个模块里。我还没有遇到过需要专门为异常创建一个模块或包的情况。
举个例子:假设我有一个叫做 jester
的模块,里面有一个类 Juggler
,这个类有一个方法 juggle
,它可能会抛出一个 DroppedBall
异常(想象一下扔烂西红柿之类的场景),那么这个 DroppedBall
异常就应该放在 jester
模块里。然后,crowd.Person
的实例可以尝试观看这个杂耍者,并且可以用 except jester.DroppedBall
来处理这个异常。
再比如,如果我有一个叫做 food
的包,里面有多个模块,比如 fruit
、vegetable
等等,它们都有一个 eat
方法(可能是从 food.Foodstuff
继承来的),这些模块可能会抛出一个 RottenException
异常,这个异常自然应该放在 food
包的根目录下,也就是 __init__.py
文件里。