Наследуемые пользовательские исключения в python - PullRequest
2 голосов
/ 17 декабря 2009

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

Я создал baseclass.py:

class Error(Exception):
    """Base class for exceptions in BaseClass"""
    pass

class SomeError(Error):
    """Exection for some error"""
    def __init__(self, msg):
        self.msg = msg

class OtherError(Error):
    """Exection for some error"""
    def __init__(self, msg):
        self.msg = msg

class BaseClass():
    """Base test class for testing exceptions"""

    def dosomething(self):
        raise SomeError, "Got an error doing something"

и производный класс.py:

from baseclass import BaseClass,SomeError,OtherError

class DerivedClass(BaseClass):

    def doother(self):
        """Do other thing"""
        raise OtherError, "Error doing other"

Затем тест, который использует DerivedClass:

#!/usr/bin/python
from derivedclass import DerivedClass,SomeError,OtherError

"""Test from within module"""
x = DerivedClass()
try:
    x.dosomething() 
except SomeError:
    print "I got some error ok"

try:
    x.doother()
except OtherError:
    print "I got other error ok"

Итак, как вы можете видеть, я импортировал классы исключений из базового класса в производный класс, а затем снова из производного класса в программу.

Кажется, это работает нормально, но не очень элегантно, и меня беспокоит необходимость убедиться и выполнить импорт в модуль производного класса для всех классов Exception. Кажется, что было бы легко забыть один при создании нового производного класса. Тогда пользователь производного класса получит ошибку, если попытается его использовать.

Есть ли лучший способ сделать это?

Спасибо!

1020 * -Марк *

Ответы [ 3 ]

0 голосов
/ 18 декабря 2009

Итак, как вы можете видеть, я импортировал классы исключений из базового класса в производный класс, затем снова из производного класса в программа.

Вы не импортировали и не могли импортировать исключения (или что-либо еще) из классов и в классы. Вы импортируете вещи из модулей и (обычно) в модули.

(обычно, потому что вы можете помещать операторы импорта в любую область, но это не рекомендуется)

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

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

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

0 голосов
/ 18 декабря 2009

Если пользователь импортирует ваши классы ошибок по имени, он заметит проблему, как только попытка импорта выполнится:

ImportError: cannot import name FrotzError
File "enduser.py", line 7, in <module>
  from ptcmark.derivedclass import FrotzError

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

from ptcmark.errors import FrotzError
0 голосов
/ 17 декабря 2009

Пользовательские исключения должны быть импортированы во все используемые им модули.

Также существует ошибка в outputclass.py

Wrong (because of the way its imported)
raise baseclass.OtherError, "Error doing other"

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