python:在完整项目中组织用户定义的异常

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,里面有各种模块,fruitvegetable等,它们都有eat的方法(毫无疑问是从food.Foodstuff继承的),它们可能会产生一个RottenException,它自然属于food包的根:__init__.py