Определение списка сообщений об ошибках и кодов ошибок - PullRequest
2 голосов
/ 15 марта 2012

Я хочу создать список (не подразумевающий Python List) сообщений об ошибках и соответствующих кодов ошибок.У меня есть два требования - быть в состоянии найти сообщение об ошибке с кодом ошибки и иметь возможность выполнить обратный поиск .

  1. Есть ли собственный тип данных Python, который может достичь этого?Если нет, то как мне это реализовать?
  2. Этот список сообщений об ошибках + коды будут использоваться BusinessRuleViolation, пользовательским классом исключений.Я хочу, чтобы этот список ассоциировался с BusinessRuleViolation и не должен изменяться во время выполнения.Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

Обычно вы делаете это с парой dict s - один отображает коды ошибок в сообщения, а затем другой (часто программно генерируемый) с обратным отображением.

error_codes_to_messages = {
   1: 'foo',
   2: 'bar',
   3: 'baz',
}

error_messages_to_codes = dict(
    (v,k) for k,v in error_codes_to_messages.iteritems()
)

Затем выможно делать поиск с []:

print error_codes_to_messages[2]
print error_messages_to_codes['foo']
3 голосов
/ 15 марта 2012

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

errors = [Error1, Error2, Error3, ...]

def lookupError(number=None, text=None, matcher=None, multiple=False):
    if number!=None:
        matcher = lambda x:x.number==number
    if text!=None:
        matcher = lambda x:text in x.text

    results = [e for e in errors if matcher(e)]
    if multiple:
        return results
    else:
        assert len(results)==1, 'Error lookup failed, expected one error but got {}'.format(results)
        return results[0]

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

>>> lookupError(number=5)
>>> lookupError(text='index')
>>> lookupError(matcher=lambda x:x.context==StartupSequence)
2 голосов
/ 15 марта 2012

Кажется, вам не нужно отображение «сообщение об ошибке» -> «код ошибки».Вы можете создать класс исключений, который содержит код ошибки и сообщение.Это позволит в будущем локализовать сообщения, не нарушая код.

Например, OSError имеет атрибуты errno, strerror, которые содержат код ошибки и сообщение соответственно.

Для более удобного отслеживания ошибок вы можете создать подклассы для часто используемых кодов ошибок, например, OSError имеет подклассы, такие как PermissionError, FileNotFoundError:

try:
    open(somefile)
except FileNotFoundError:
    # handle file not found error
except PermissionError:
    # handle permission problem

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

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