Python 定义错误消息和错误代码的列表

Python 定义错误消息和错误代码的列表,python,exception,Python,Exception,我想创建一个错误消息和相应错误代码的列表(不意味着Pythonlist)。我有两个要求-能够在给定错误代码的情况下查找错误消息,并能够执行相反的查找 是否有一种本机python数据类型可以实现这一点?如果没有,我应该如何实施 此错误消息+代码列表将由自定义异常类BusinessRuleViolation使用。我希望此列表与BusinessRuleViolation关联,并且不应在运行时修改。我该怎么做 通常,您会使用一对dicts来实现这一点,一个是将错误代码映射到消息,然后是另一个(通常是通过

我想创建一个错误消息和相应错误代码的列表(不意味着Python
list
)。我有两个要求-能够在给定错误代码的情况下查找错误消息,并能够执行相反的查找

  • 是否有一种本机python数据类型可以实现这一点?如果没有,我应该如何实施
  • 此错误消息+代码列表将由自定义异常类BusinessRuleViolation使用。我希望此列表与BusinessRuleViolation关联,并且不应在运行时修改。我该怎么做

  • 通常,您会使用一对
    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']
    

    或者您可以只收集一组错误代码对象,因为这不太可能成为性能瓶颈:

    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)
    
    似乎您不需要“错误消息”->“错误代码”映射。您可以创建一个包含错误代码和消息的异常类。它将允许在将来不破坏任何代码的情况下本地化消息

    例如,
    OSError
    具有
    errno
    strerror
    属性,这些属性包含相应的错误代码和消息

    为了更方便地捕获错误,您可以为经常使用的错误代码创建子类,例如,
    OSError
    具有子类,例如
    PermissionError
    FileNotFoundError

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

    Python是一种动态语言,因此可以很容易地从错误代码、消息的当前表示形式中以编程方式生成异常类。

    为什么需要在给出错误消息的情况下查找错误代码?消息来自哪里?@J.F.Sebastian-错误消息、代码以及消息和代码之间的关联都是自定义的。该错误消息将由自定义异常类BusinessRuleViolation使用。我计划使用错误代码检索它们相应的错误消息,以便在单元测试中使用
    assertRaisesRegexp
    。@J.F.Sebastian-只是为了补充我之前的评论。我之所以采用这种方法,是因为我知道错误消息的措辞稍后会有所改变,因为我现在不愿意花时间担心它们的措辞。那么,不要在代码中使用错误消息,而是使用简短的描述性消息。如果需要向用户显示,那么您可以通过gettext或类似的机制(本地化机制有许多非正统用法:)@przemo_li-我想您已经超过我了。在这个阶段,我不想担心设计应用程序的错误。但我真正需要的是看到定制异常在我期望的时候被提出(说到单元测试业务逻辑)。因此,我现在只需要一组静态错误代码和动态但有意义的错误消息。这样说来,你的建议很好,我可以考虑一下。谢谢你的回答,安伯。看起来很棒。至于我问题的2),将
    error\u codes\u to\u messages
    作为BusinessRuleViolation类的一部分实施,并将名称更改为
    error\u codes\u to\u messages
    以表示不应更改,这样做对吗?