Подтвердить что ты не робот

Пользовательские исключения на Python с кодами ошибок и сообщениями об ошибках

class AppError(Exception):
    pass

class MissingInputError(AppError):
    pass

class ValidationError(AppError):
    pass

...

def validate(self):
    """ Validate Input and save it """

    params = self.__params

    if 'key' in params:
        self.__validateKey(escape(params['key'][0]))
    else:
        raise MissingInputError

    if 'svc' in params:
        self.__validateService(escape(params['svc'][0]))
    else:
        raise MissingInputError

    if 'dt' in params:
        self.__validateDate(escape(params['dt'][0]))
    else:
        raise MissingInputError


def __validateMulti(self, m):
    """ Validate Multiple Days Request"""

    if m not in Input.__validDays:
        raise ValidationError

    self.__dCast = int(m)

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

Я хотел бы определить некоторые настраиваемые коды ошибок и сообщения об ошибках, характерные для моего приложения, например

Ошибка 1100: "Ключ не найден. Пожалуйста, подтвердите свой ввод."

Ошибка 1101: "Параметр даты не найден. Проверьте свой ввод"

...

Ошибка 2100: Параметр "Несколько дней" недействителен. Принимаемые значения - 2, 5 и 7. "

и сообщите об этом пользователю.

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

(P.S: Это для Python 2.4.3).


Bastien Léonard упоминает в этом SO комментарий, что вы не должны всегда определять новый __init__ или __str__; по умолчанию аргументы будут помещены в self.args, и они будут напечатаны __str__.

Таким образом, решение, которое я предпочитаю:

class AppError(Exception): pass

class MissingInputError(AppError):

    # define the error codes & messages here
    em = {1101: "Some error here. Please verify.", \
          1102: "Another here. Please verify.", \
          1103: "One more here. Please verify.", \
          1104: "That was idiotic. Please verify."}

Использование:

try:
    # do something here that calls
    # raise MissingInputError(1101)

except MissingInputError, e
    print "%d: %s" % (e.args[0], e.em[e.args[0]])
4b9b3361

Ответ 1

Вот быстрый пример написания пользовательского класса Exception со специальными кодами...

class ErrorWithCode(Exception):
    def __init__(self, code):
        self.code = code
    def __str__(self):
        return repr(self.code)

try:
    raise ErrorWithCode(1000)
except ErrorWithCode as e:
    print "Received error with code:", e.code

Изменить. Поскольку вы спрашивали, как использовать args здесь дополнительный пример...

class ErrorWithArgs(Exception):
    def __init__(self, *args):
        # *args is used to get a list of the parameters passed in
        self.args = [a for a in args]

try:
    raise ErrorWithArgs(1, "text", "some more text")
except ErrorWithArgs as e:
    print "%d: %s - %s" % (e.args[0], e.args[1], e.args[2])