Пользовательские исключения Python с кодами ошибок и сообщениями об ошибках - PullRequest
35 голосов
/ 30 мая 2011
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: «Параметр Multiple Day недействителен. Допустимые значения: 2, 5 и 7».

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

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

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


Бастиен Леонар упоминает в этом комментарии 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]])

Ответы [ 2 ]

64 голосов
/ 30 мая 2011

Вот краткий пример пользовательского класса 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]))
1 голос
/ 09 мая 2018

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

class CustomError(Exception):
"""
Custom Exception
"""

  def __init__(self, error_code, message='', *args, **kwargs):

      # Raise a separate exception in case the error code passed isn't specified in the ErrorCodes enum
      if not isinstance(error_code, ErrorCodes):
          msg = 'Error code passed in the error_code param must be of type {0}'
          raise CustomError(ErrorCodes.ERR_INCORRECT_ERRCODE, msg, ErrorCodes.__class__.__name__)

      # Storing the error code on the exception object
      self.error_code = error_code

      # storing the traceback which provides useful information about where the exception occurred
      self.traceback = sys.exc_info()

      # Prefixing the error code to the exception message
      try:
          msg = '[{0}] {1}'.format(error_code.name, message.format(*args, **kwargs))
      except (IndexError, KeyError):
          msg = '[{0}] {1}'.format(error_code.name, message)

      super().__init__(msg)


# Error codes for all module exceptions
@unique
class ErrorCodes(Enum):
    ERR_INCORRECT_ERRCODE = auto()      # error code passed is not specified in enum ErrorCodes
    ERR_SITUATION_1 = auto()            # description of situation 1
    ERR_SITUATION_2 = auto()            # description of situation 2
    ERR_SITUATION_3 = auto()            # description of situation 3
    ERR_SITUATION_4 = auto()            # description of situation 4
    ERR_SITUATION_5 = auto()            # description of situation 5
    ERR_SITUATION_6 = auto()            # description of situation 6

Перечисление ErrorCodes используется для определения кодов ошибок. Исключение создается таким образом, что переданному коду ошибки предшествует сообщение об исключении.

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