Python: организация пользовательских исключений в полном проекте - PullRequest
11 голосов
/ 15 ноября 2010

У меня есть несколько вопросов о пользовательских исключениях в 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

Я хотел бы внедрить свое собственное исключение, чтобы использовать их в модулях пакета 'working' для конкретных ошибок.

Где я должен разместить эти исключения? Я знаю, что у меня должно быть свое собственное базовое исключение, которое подклассирует стандартный класс Exception и подкласс его для других моих исключений. Должен ли я создать новый модуль «Исключения» в разделе «Работники»? Поместить классы исключений в модуль, в котором они создаются? В этом случае, где я должен поставить свой базовый класс? Приспособлена ли структура моего приложения?

Я новичок в исключениях в Python, поэтому извините, если ответ очевиден ...

1 Ответ

7 голосов
/ 15 ноября 2010

В общем, я обнаружил, что когда я хочу создать исключение особого типа, это связано с конкретным модулем или пакетом.Если это имеет отношение к модулю, я помещаю это только в тот модуль.Я еще не нашел случая, когда было бы лучше иметь модуль или пакет, выделенный для исключений.

Примеры: если у меня есть модуль jester, с классом Juggler в нем сметод juggle, который может поднять DroppedBall (метание гнилых помидоров или тому подобное), DroppedBall будет в модуле jester.Тогда crowd.Person экземпляры могли бы try наблюдать за жонглером и except jester.DroppedBall.

Если бы у меня был пакет food с различными модулями в нем, fruit, vegetable и т. Д., Которыйу всех есть метод eat (унаследованный от food.Foodstuff, несомненно), они могут поднять RottenException, который, естественно, принадлежит корню пакета food: __init__.py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...