Python:完整项目中用户定义异常的组织方法

14 投票
1 回答
3846 浏览
提问于 2025-04-16 07:04

我有一些关于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 个回答

8

一般来说,我在自己的工作中发现,当我想要一个自定义的异常类型时,它通常是针对某个特定的模块或包的。如果这个异常和某个模块相关,我就会把它放在那个模块里。我还没有遇到过需要专门为异常创建一个模块或包的情况。

举个例子:假设我有一个叫做 jester 的模块,里面有一个类 Juggler,这个类有一个方法 juggle,它可能会抛出一个 DroppedBall 异常(想象一下扔烂西红柿之类的场景),那么这个 DroppedBall 异常就应该放在 jester 模块里。然后,crowd.Person 的实例可以尝试观看这个杂耍者,并且可以用 except jester.DroppedBall 来处理这个异常。

再比如,如果我有一个叫做 food 的包,里面有多个模块,比如 fruitvegetable 等等,它们都有一个 eat 方法(可能是从 food.Foodstuff 继承来的),这些模块可能会抛出一个 RottenException 异常,这个异常自然应该放在 food 包的根目录下,也就是 __init__.py 文件里。

撰写回答